协调工作线程关闭

Bas*_*sic 3 c# vb.net multithreading

我有一个List(Of IWorker)包含许多混凝土的.IWorker反过来有一个Startup()Shutdown()方法.

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

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

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

  • 添加State属性到IWorker.应该工作,但我将轮询状态似乎有点讨厌.
  • 使关闭命令阻塞 - 可能是我理想的解决方案,但我不确定如何实现它 - 工作者是否应该在设置标志后尝试Synclock Sunclock的私有对象Shutdown()
  • 别的什么?

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

Ree*_*sey 5

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

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

如果你必须使用.NET 3.5或更早版本,我会在Shutdown()内部调用WaitHandle,例如a ManualResetEvent.关机代码可能如下所示:

' Include:
Private shutdownEvent as ManualResetEvent = new ManualResetEvent(false)

Sub Shutdown()
    ShutDownRequested = True
    shutdownEvent.WaitOne()
End Sub
Run Code Online (Sandbox Code Playgroud)

然后轮询循环(线程操作)将执行:

Sub Execute()
    While Not ShutDownRequested
        ' Do your work
    End While

    ' Before you exit, "set" the event:
    shutdownEvent.Set()
End Sub
Run Code Online (Sandbox Code Playgroud)