我在工作线程中有一个对象,我可以指示它停止运行.我可以使用bool或AutoResetEvent来实现它:
布尔:
private volatile bool _isRunning;
public void Run() {
while (_isRunning)
{
doWork();
Thread.Sleep(1000);
}
}
Run Code Online (Sandbox Code Playgroud)
的AutoResetEvent:
private AutoResetEvent _stop;
public void Run() {
do {
doWork();
} while (!_stop.WaitOne(1000));
}
Run Code Online (Sandbox Code Playgroud)
Stop()然后该方法将设置_isRunning为false或调用_stop.Set().
除此之外,使用AutoResetEvent的解决方案可能会更快停止,这些方法之间有什么区别吗?这个比那个好吗?
我在 Windows 服务中有一个线程 (STAThread),它执行大量工作。当 Windows 服务重新启动时,我想优雅地停止这个线程。
我知道几种方法
据我发现 Thread.Abort 是不行的......
最佳做法是什么?这项工作是在另一个类中执行的,而不是线程启动的类,因此有必要在构造函数中引入一个 cancelToken 参数,或者例如有一个 volatile 变量。但我就是不知道什么是最聪明的。
更新
只是为了澄清一点,我已经总结了我正在谈论的一个非常简单的例子。如前所述,这是在 Windows 服务中完成的。现在我正在考虑一个在循环中检查的可变布尔值或一个取消令牌......我不能等待循环完成,如下所述,它可能需要几分钟,使服务器的系统管理员相信当他们需要重新启动服务时,服务出了点问题......我可以毫无问题地将循环中的所有工作都毫无问题地删除,但是我不能用 Thread.Abort 来做到这一点,它是“邪恶的”,而且是一个 COM接口被调用,所以需要一个小的清理。
Class Scheduler{
private Thread apartmentThread;
private Worker worker;
void Scheduling(){
worker = new Worker();
apartmentThread = new Thread(Run);
apartmentThread.SetApartmentState(ApartmentState.STA);
apartmentThread.Start();
}
private void Run() {
while (!token.IsCancellationRequested) {
Thread.Sleep(pollInterval * MillisecondsToSeconds);
if (!token.IsCancellationRequested) {
worker.DoWork();
}
}
}
}
Class Worker{
//This will take several minutes....
public void DoWork(){
for(int i = 0; i < …Run Code Online (Sandbox Code Playgroud)