首页 > 解决方案 > 我应该使用 Thread.Sleep() 检查进程是否仍在运行吗?

问题描述

正如标题所说,我目前正在制作一个 WPF 应用程序,我需要检测一个应用程序是否正在运行并在它关闭时执行某些操作。我想到的方法是运行一个单独的线程并每两秒检查一次进程是否仍在运行,如下所示:

while(Process.GetProcessesByName(processName).Length != 0) {
    Thread.Sleep(2000);
}

//Do something

这会是一个很好的解决方案,还有其他方法吗?

谢谢

标签: c#wpfmultithreadingsleep

解决方案


这会是一个很好的解决方案吗?

不,因为它几乎没有浪费整个线程。

更好地使用计时器,在 WPF 应用程序中最好使用 DispatcherTimer:

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };

timer.Tick += (s, e) =>
{
    if (Process.GetProcessesByName(processName).Length > 0)
    {
        // ...
    }
};

timer.Start();

如果要在 UI 线程上执行冗长的操作,您可以使用Tick等待 a 的异步事件处理程序Task(它将在后台的线程池线程上运行):

var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) };

timer.Tick += async (s, e) =>
{
    if (Process.GetProcessesByName(processName).Length > 0)
    {
        await Task.Run(() =>
        {
            // lengthy operation here which runs on a thread pool thread
        });

        // udate UI here
    }
};

timer.Start();

推荐阅读