【发布时间】:2019-06-06 12:33:10
【问题描述】:
我想使用 Thread.Sleep 循环暂停文件更新(可能需要几秒钟),该循环每秒检查时间戳更改。但是,应用程序在睡眠循环期间完全冻结,甚至无法刷新显示。
我查看了以下(简化的)代码,它不会冻结程序。但是程序在 Worker 函数结束之前到达结尾(打印“Done”) - 等待 func 完成(在“done”之前打印“end”)。未注释最后一行,等待 func 结束,冻结应用程序。
有没有更好的方法来等待文件更改而不冻结应用程序?如果没有,如何在不冻结应用程序的情况下等待一个冗长的函数完成并等待函数完成后再开始主代码?
private static ManualResetEvent resetEvent = new ManualResetEvent(false);
private void Worker(object ignored)
{
Print("start");
Thread.Sleep(5000);
Print("end")
resetEvent.Set();
}
Main:
ThreadPool.QueueUserWorkItem(new WaitCallback(Worker));
Print("Done");
//resetEvent.WaitOne();
最后一行注释的输出:
- 完成
- 开始
- 结束
最后一行未注释的输出: (然后应用程序冻结): 1.开始 2.结束 3. 完成
预期的,没有冻结:
- 开始
- 结束
- 完成
【问题讨论】:
-
这是在控制台应用程序、winforms、WPF 中吗?
-
请检查 async await C# 关键字。
-
这是一个控制台应用程序
标签: c# threadpool