相关疑难解决方法(0)

AutoResetEvent vs. boolean停止线程

我在工作线程中有一个对象,我可以指示它停止运行.我可以使用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的解决方案可能会更快停止,这些方法之间有什么区别吗?这个比那个好吗?

c# multithreading autoresetevent

12
推荐指数
2
解决办法
4429
查看次数

停止线程、ManualResetEvent、易失性布尔值或取消令牌

我在 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)

c# multithreading cancellation cancellation-token

5
推荐指数
2
解决办法
9292
查看次数