如何暂停程序并重新开始?

时间:2019-05-02 11:14:41

标签: c# wpf mvvm

我想开始一个过程,但要在特定时间点停止它,然后如果满足所有条件,请重新开始该过程。

我可以看到how to pause/resume a thread这个问题的答案,但是在我的情况下我无法使用它。

如何在wpf中使用MVVM模式进行操作?

赞赏正确方向上的任何观点。

1 个答案:

答案 0 :(得分:0)

如果要暂停进程而不是线程,则必须使用外部方法

要按名称获取进程,可以使用System.Diagnostic.Process程序集

Process[] localByName = Process.GetProcessesByName("process");

杀死进程:

CurrentProcess.Kill();

暂停过程:

    [Flags]
    public enum ThreadAccess : int
    {
      TERMINATE = (0x0001),
      SUSPEND_RESUME = (0x0002),
      GET_CONTEXT = (0x0008),
      SET_CONTEXT = (0x0010),
      SET_INFORMATION = (0x0020),
      QUERY_INFORMATION = (0x0040),
      SET_THREAD_TOKEN = (0x0080),
      IMPERSONATE = (0x0100),
      DIRECT_IMPERSONATION = (0x0200)
    }

    [DllImport("kernel32.dll")]
    static extern IntPtr OpenThread(ThreadAccess dwDesiredAccess, bool bInheritHandle, uint dwThreadId);
    [DllImport("kernel32.dll")]
    static extern uint SuspendThread(IntPtr hThread);
    [DllImport("kernel32.dll")]
    static extern int ResumeThread(IntPtr hThread);
    [DllImport("kernel32", CharSet = CharSet.Auto,SetLastError = true)]
    static extern bool CloseHandle(IntPtr handle);


private static void SuspendProcess(int pid)
{
   var process = Process.GetProcessById(pid);

   if (process.ProcessName == string.Empty)
     return;

   foreach (ProcessThread pT in process.Threads)
   {
      IntPtr pOpenThread = OpenThread(ThreadAccess.SUSPEND_RESUME, false, (uint)pT.Id);

      if (pOpenThread == IntPtr.Zero)
        continue;

      SuspendThread(pOpenThread);
      CloseHandle(pOpenThread);
   }
}

PS: 您是否要使用上次会话的数据重新启动该过程?


请参阅:Suspend Process in C#