唤醒线程退出的最佳方法是什么? C#

时间:2010-01-26 08:45:40

标签: c# .net multithreading sleep

我生成一个线程(只有一个)做一些工作,除了调用callback()以查看用户是否想要退出(还发送一个状态报告)之外,它几乎不会访问除了脚踏板之外的任何数据回到GUI中显示的主线程。

当关闭关闭exe时我想唤醒线程并让它退出,最好的方法是什么?回调已经说明了如果用户想要退出所以现在问题是使用Thread.Sleep并提前唤醒它以便它可以退出而不是让进程再活几秒或几分钟。这个功能很适合停止更快退出。

3 个答案:

答案 0 :(得分:3)

另一种方法如下:

在您的计划中加ManualResetEvent,并在希望线程完成并关闭时调用Set。不要在工作线程上调用Thread.Sleep,而是调用event.WaitOne并传入TimeSpan对象。如果事件已发出信号,则工作线程将在超时发生前唤醒 - WaitOne将返回true

答案 1 :(得分:2)

使用BackgroundWorker或将线程的IsBackground属性设置为true,然后它就不会让您的应用程序保持打开状态。

我推荐使用BackgroundWorker,但后者是一个快速解决方法。

<强>更新

原帖在张贴问题后改变了他的要求(见本问题附带的评论)。更新回答如下:

如果要在不结束应用程序的情况下停止后台操作,请参阅后台工作人员的CancelAsync方法。此外,请勿使用Thread.Sleep - 使用WaitHandle并在需要等待的内容上调用WaitOne

答案 2 :(得分:1)

我必须同意马克。您的问题唯一清楚的是您需要重新检查线程策略。 你说你有一个线程正在工作,但你说你想要唤醒它?

线程在等待工作吗?如果是这样,请在较短的周期内睡觉并更频繁地检查退出或使用重置事件。唤醒线程的最佳方法是不要让它进入睡眠状态。做你需要做的并退出。在开始任何长时间运行操作之前,始终检查中断信号,无论以何种形式实现它们,再次,如果必须在线程休眠,请在短周期内完成。

线程是否忙,你想要中断它?如果您无法对其进行检测,以便及时响应中断信号,您可能别无选择,只能将其杀死。