C#程序在for循环中冻结

Dio*_*sis 0 c# freeze

我在这里有这个代码,开始一个进程等待8秒,然后再次杀死它.

for (int i = 0; i < 20; i++)
{
    Process pro = new Process();
    pro.StartInfo.FileName = @"C:\Program Files (x86)\Mozilla Firefox\firefox.exe";
    pro.StartInfo.WindowStyle = ProcessWindowStyle.Minimized;
    pro.Start();

    Thread.Sleep(8000);

    try
    {
        pro.Kill();
        Thread.Sleep(1000);
    }
    catch
    {
        return;
    }
}
Run Code Online (Sandbox Code Playgroud)

当我在调试模式或直接从.exe运行应用程序时,它成功启动并终止进程,但它被冻结.我无法移动窗口或点击其他按钮..

Eri*_*ert 12

它被冻结了.我无法移动窗口或点击其他按钮.

那是对的.你说让线程入睡.

人们似乎有这样一个奇怪的想法,按下按钮时运行代码是由魔术发生的.魔术不会发生这种情况.之所以会发生这种情况,是因为该线程运行的代码处理来自操作系统的"单击按钮"消息.如果你让一个线程进入休眠状态,它会停止处理这些消息,因为它处于睡眠状态.

让一个线程进入睡眠是99%的时间完全错误的事情,所以就是不要这样做.

在C#5中做的正确的事情是制作你的方法async,然后做一个await Task.Delay(whatever).或者,创建一个在几秒钟后滴答的计时器.在tick处理事件中,关闭计时器并在那里执行逻辑.

  • @LucaCremonesi:这绝对不是我做的方式,我不知道为什么你认为这会帮助你实现目标.您精确,可衡量的目标是什么,以及您收集的经验证据表明该技术可以实现您的目标?你认为"睡眠(1)"已结束,说"收益率"有什么好处? (4认同)
  • @LucaCremonesi:我经常听到人们说他们希望CPU利用率很低,我真的很担心.我为那个CPU支付了很多钱,我想要它被使用!如果你的CPU一直以5%的容量运行,那么肯定你多付了20倍. (3认同)
  • 或者,如果您希望所有其他非空闲线程优先,那么简单地将线程的优先级设置为低于平均值是错误的? (2认同)