سؤال

أحاول إعادة تشغيل تطبيق في WPF.

حاولت ما يلي:

Process.Start(Application.ExecutablePath);
Process.GetCurrentProcess().Kill();

وهذا لا يعمل لأن التطبيق يتم إعداده كتطبيق لحالات واحدة.

ثم تعبت هذا:

Process.GetCurrentProcess().Kill();
Process.Start(Application.ExecutablePath);

وهذا لا يعمل لأنه بمجرد أن نقتل العملية ، فلن يضرب الخط 2

هل هناك طريقة لتحديد موعد. البدء حتى لا أواجه العدد رقم 1.

هل كانت مفيدة؟

المحلول

يمكنك تشغيل تطبيق ثانوي من شأنه إعادة إطلاق برنامجك الرئيسي بعد التأخير. عندما كتبت ذاتيا قبل بضع سنوات ، كان هذا هو مسار التنفيذ الذي اتخذته. لقد كان مجرد برنامج بسيط أخذ القابل للتنفيذ كخط أوامر ، سينام لعاشر ثانية ، ثم ابدأ.

سيكون مسار تنفيذ أفضل مما اتخذته هو أن يكون البرنامج الذي تم إطلاقه حديثًا ينتظر العملية التي أطلقتها لإنهاءها. إن انتظار طول الوقت التعسفي قد يعقد الأمور. من أجل تحقيق ذلك ، ربما أقوم بتمرير معرف العملية إلى إعادة التشغيل حتى يعرف بالضبط العملية التي يجب انتظارها.

نصائح أخرى

ليس من الصعب كما تعتقد. كل ما عليك فعله هو استدعاء الطريقة التالية ، تمرير سطر الأوامر للمثال الذي تم إعادة تشغيله:

public static void RestartMe(string commandLine)
{
  var myId = Process.GetCurrentProcess().Id;
  var myPath = Assembly.GetEntryAssembly().CodeBase.Replace("file:///", "");
  var systemPath = typeof(object).Assembly.CodeBase.Replace("file:///", "");

  var tempPath = Path.GetTempFileName();

  File.WriteAllText(tempPath + ".cs", @"
    using System;
    using System.Diagnostics;
    public class App
    {
      public static void Main(string[] args)
      {
        try { Process.GetProcessById(" + myId + @").WaitForExit(); } catch {}
        Process.Start(""" + myPath + @""", Environment.CommandLine);
      }
    }");

  var compiler = new ProcessStartInfo
  {
    FileName = Path.Combine(Path.GetDirectoryName(systemPath), "csc.exe"),
    Arguments = tempPath + ".cs",
    WorkingDirectory = Path.GetDirectoryName(tempPath),
    WindowStyle = ProcessWindowStyle.Hidden,
  };

  var restarter = new ProcessStartInfo
  {
    FileName = tempPath + ".exe",
    Arguments = commandLine,
    WindowStyle = ProcessWindowStyle.Hidden,
  };

  Process.Start(compiler).WaitForExit();
  Process.Start(restarter); // No WaitForExit: restarter WaitForExits us instead

  File.Delete(tempPath);
  File.Delete(tempPath + ".cs");
  Environment.Exit(0);
}

كيف يعمل: هذا في الواقع يقوم بإنشاء برنامج "استعادة" آخر ولكنه يفعل ذلك بشكل غير مؤلم وتلقائي. يحتوي برنامج RESTARTER على معرف العملية الحالي واسم الملف القابل للتنفيذ المبني مباشرة فيه. سيجد دائمًا برنامج التحويل البرمجي لأن إصدار الإطار الصافي يشحن مع csc.exe متوافق في نفس المجلد مثل System.dll.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top