it-swarm-tr.com

Application.Restart () neden güvenilir değil?

C # 'daki Application.Restart() yöntemini kullanarak geçerli uygulamayı yeniden başlatmalısınız: ancak bu her zaman çalışmıyor gibi görünüyor.

Bu sorunun bir nedeni var mı, birileri bana neden sürekli işe yaramadığını söyleyebilir mi?

42
MADMap

Bunun için birçok sebep olabilir. Metodun işe yaramadığı değil; aksine, çoğu zaman programcılar kodlarına, uygulamanın otomatik olarak kapanmasını veya başlamasını engelleyecek bir şey koyduğunu unuturlar. İki örnek:

  • Bir formdaki Closing olayı bir uygulamanın kapanmasını durdurabilir
  • Halen devam etmekte olan bir işlemi kontrol ediyorsanız, eskisi yenisinin başlamasına izin verecek kadar hızlı kapanmıyor olabilir.

Böyle bir şey için kodunuzu kontrol edin. Bu davranışı boş bir uygulamada görüyorsanız, gerçek işlevde bir sorun olması kodunuzdan daha muhtemeldir.

Microsoft'un uygulama yeniden başlatma kaynak kodunu kontrol edin.

27
TheSmurf

Benim durumumda (tek örnek yok), nerede

Application.Restart();

işe yaramadı

System.Diagnostics.Process.Start(Application.ExecutablePath);
Application.Exit();

iş yaptı!

18
cprcrack

Bu tür bir sorunla karşılaştığım tek zaman, ana formumda özel bir FormClosing olay işleyicisine sahip olduğum, mantığı gerçekleştiren ve olayı iptal ettiğim zamandı.

DÜZENLE:

Şimdi başka bir örneğe rastladım ve yorumlarınıza dayanarak muhtemelen yaşadıklarınızı yansıtıyor. 

Bir tek örnek uygulama çalıştırırken, bir Mutex kullanarak, çok fazla temizleme işlemi yapılmış oldukça gömülü bir yerden Application.Restart() işlevini çağırıyordum. Öyleyse, önceki örnek tamamlanmadan önce yeniden başlatma işlemi yeni bir örnek başlatıyor gibi görünüyor, bu nedenle Mutex yeni örneği başlatmaya başlamıştı.

7
Timothy Carter

Programımda, bilgisayarda çalışan uygulamanın yalnızca bir örneğini sağlamak için bir muteks var. Bu, yeni başlatılan uygulamanın başlamamasına neden oldu çünkü muteks zamanında serbest bırakılmadı. Sonuç olarak, uygulamanın yeniden başlatıldığını belirten Properties.Settings içine bir değer koydum. Application.Restart() işlevini çağırmadan önce Properties.Settings değeri true olarak ayarlanır. Program.Main() içinde ayrıca true , false değerine sıfırlandığında ve böylece bir Thread.Sleep(3000); olduğu için, bu belirli property.settings değerini kontrol ettim.

Programınızda mantık olabilir:

if (ShouldRestartApp)
{
   Properties.Settings.Default.IsRestarting = true;
   Properties.Settings.Default.Save();
   Application.Restart();
}

Program.Main() içinde

[STAThread]
static void Main()
{
   Mutex runOnce = null;

   if (Properties.Settings.Default.IsRestarting)
   {
      Properties.Settings.Default.IsRestarting = false;
      Properties.Settings.Default.Save();
      Thread.Sleep(3000);
   }

   try
   {
      runOnce = new Mutex(true, "SOME_MUTEX_NAME");

      if (runOnce.WaitOne(TimeSpan.Zero))
      {
         Application.EnableVisualStyles();
         Application.SetCompatibleTextRenderingDefault(false);
         Application.Run(new Form1());
      }
   }
   finally
   {
      if (null != runOnce)
         runOnce.Close();
   }
}

Bu kadar.

5
cmptrs4now

Boşaltmadan önce kilitlemeyi deneyin. İşte tam bir uygulama dökümü başlatıyorum. İşe yarayabilir, olmayabilir.

Context.Application.Lock();
Context.Session.Abandon();
Context.Application.RemoveAll();
Context.Application.Restart();
Context.Application.UnLock();
2
Oli

Uygulama ilk önce bir ağ konumundan başlatıldıysa ve imzasızsa (önce uyarı iletişim kutusunu alırsınız), yeniden başlatılmaz ve yalnızca çıkar.

1
Matt Hanson
Application.Restart();
Application.ExitThread();                                                     

bu benim için çalıştı teşekkürler.

1
shima lagzian

Bu kodu dene:

bool appNotRestarted = true;

Bu kod aynı zamanda işlevde olmalıdır:

if (appNotRestarted == true)
{
    appNotRestarted = false;
    Application.Restart();
    Application.ExitThread();
}
1
ferhatayhan

Bunun eski bir iş parçacığı olduğunu biliyorum, ancak bir geçici çözüm buldum. Umarım bu ihtiyacı olan birine yardımcı olacaktır. 

Koddan bir ClickOnce Uygulaması başlatılırken güncelleme sırasını tetikleyecek bir çözüme ihtiyacım vardı. Applicatoin.Restart bunu yapmadı. Bir güncellemeyi kontrol edebilmek ve daha sonra özel bir güncelleme yazmak zorunda kalmamak için yerleşik güncelleme yöneticisini çağırmak için bir yol istedim.

    'VB Code Sample
    Dim strStart As String = System.Environment.GetFolderPath(Environment.SpecialFolder.StartMenu) & "\Programs\Folder\YourApplication.appref-ms"
    Application.Exit()
    Try
        Process.Start(strStart)
    Catch ex As Exception
        'Do something with the exception
    End Try

Bu geçici çözümle gördüğüm tek sorun, bir kullanıcının kısayolu başlat menüsünden silebilmesidir. Bu bir kaygı ise, başlat menüsü bağlantısını seçtiğiniz bir klasöre, tercihen ClickOnce uygulama klasörüne kopyalamak için bir kod yazabilirsiniz. Bu, uygulamanızın başlat menüsü simgesi bir .lnk veya .exe olmadığı için önemlidir. Aslında bir .appref-ms bağlantısıdır. Bkz. ClickOnce .appref-ms, .application dosyasına giden bir bağlantıdan daha mı fazla? Bu bağlantı daha ayrıntılı olarak açıklar.

Bu kod ClickOnce SingleInstance Uygulamaları ile çalışacaktır.

0
Nathan
public static void ApplicationRestart(params string[] commandLine)
    {
        lock (SynchObj)
        {
            if (Assembly.GetEntryAssembly() == null)
            {
                throw new NotSupportedException("RestartNotSupported");
            }

            if (_exiting)
                return;

            _exiting = true;

            if (Environment.OSVersion.Version.Major < 6) return;

            bool cancelExit = true;

            try
            {
                foreach (Form f in Application.OpenForms.OfType<Form>().ToList())
                {
                    f.InvokeIfRequired(frm =>
                    {
                        frm.FormClosing += (sender, args) => cancelExit = args.Cancel;
                        frm.Close();
                    });

                    if (cancelExit) break;
                }

                if (cancelExit) return;

                Process.Start(new ProcessStartInfo
                {
                    UseShellExecute = true,
                    WorkingDirectory = Environment.CurrentDirectory,
                    FileName = Application.ExecutablePath,
                    Arguments = commandLine.Length > 0 ? string.Join(" ", commandLine) : string.Empty
                });

                Application.Exit();
            }
            finally
            {
                _exiting = false;
            }
        }
    }
0
Martin.Martinsson

Net 4.7 framework ile aynı sorunu var. Kabul edilen cevap başarımın anahtarıydı .. ..Ben zaman alan ve yeniden başlatma işlemini durduran FormClosing etkinliğinde kod aldım .

If JustCloseIT = False Then
   'all closing code, like logging the session log-out to a database and all those goodies we all do.
 End If

ancak o zaman Application.Restart () çalıştı!

0
Nandostyle