协调工作线程关闭

时间:2011-11-01 15:41:53

标签: c# vb.net multithreading

我有一个包含许多混凝土的List(Of IWorker)IWorker又有Startup()Shutdown()方法。

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

这一切都运行良好,但目前父应用程序无法确定工人是否已完成关闭。

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

  • State属性添加到IWorker。应该工作,但我将轮询那些看起来有点讨厌的州。
  • 使关闭命令阻塞 - 可能是我理想的解决方案,但我不确定如何实现它 - 工作者Sunclock是一个私有对象Shutdown()也应该在设置后尝试同步国旗?
  • 别的什么?

任何文章,建议或建议表示赞赏。 C#或VB中的例子很好。

3 个答案:

答案 0 :(得分:5)

如果您希望关闭是阻塞操作,我不会尝试使用锁定来阻止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

答案 1 :(得分:4)

有一个方法Thread.Join会阻塞直到线程结束 - 任何用途?

答案 2 :(得分:0)

为什么不在ShutdownComplete上添加IWorker事件,并确保它在完成时具体完成的最后一件事情?我知道这听起来可能会强制实现执行特定的操作,但如果你有一个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();

}