协调工作线程关闭

本文关键字:线程 工作 协调 | 更新日期: 2023-09-27 18:13:05

我有一个List(Of IWorker),其中包含一些混凝土。IWorker依次有Startup()Shutdown()

在Worker类中,Startup()创建一个新的Worker线程然后返回。Shutdown()目前设置一个私有的ShutDownRequested标志并返回。该标志由工作线程检查(最坏每隔几秒)。

这些都可以正常工作,但是目前父应用无法确定Worker是否已经完成关闭。

我可以看到很多方法,但我不确定什么是最好的。

  • State属性添加到IWorker。应该可以,但是我要在各州投票,这看起来有点讨厌。
  • 使关闭命令阻塞-可能是我理想的解决方案,但我不确定如何实现它-工作SunclockShutdown()设置标志后也应该尝试同步的私有对象吗?
  • 别的吗?

任何文章,建议或建议表示感谢。c#或VB的例子都可以。

协调工作线程关闭

我不会尝试在Shutdown()上使用锁定来阻塞,如果你想关闭是一个阻塞操作。

如果你可以使用。net 4,我会将你的内部执行方法设置为Task。然后你可以调用Task.Wait()来阻塞,直到它完成。

如果你必须使用。net 3.5或更早的版本,我会让Shutdown()调用在内部等待一个WaitHandle,比如ManualResetEvent。然后关闭代码看起来像:

' Include:
Private shutdownEvent as ManualResetEvent = new ManualResetEvent(false)
Sub Shutdown()
    ShutDownRequested = True
    shutdownEvent.WaitOne()
End Sub

轮询循环(线程操作)将会做:

Sub Execute()
    While Not ShutDownRequested
        ' Do your work
    End While
    ' Before you exit, "set" the event:
    shutdownEvent.Set()
End Sub

有一个Thread方法。连接将阻塞,直到线程结束-任何使用?

为什么不在IWorker上添加ShutdownComplete事件,并确保它是每个具体完成时的最后一件事?我知道这听起来可能会迫使实现做一些特定的事情,但如果你有IWorker的基类,这应该是一个大问题。考虑这个。

public abstract class WorkerBase : IWorker
{
  public event EventHandler ShutdownComplete;
  //...other implemenation details
  public void Shutdown()
  {
    this.ShutdownInternal();
    this.ShutdownComplete(this, EventArgs.Empty);
  }
  protected abstract void ShutdownInternal();
}