我有一个 List(Of IWorker)
,其中包含许多具体内容。 IWorker
依次有一个 Startup()
和 Shutdown()
方法。
在 Worker 类中,Startup()
创建一个新的工作线程,然后返回。 Shutdown()
目前设置一个私有(private)的 ShutDownRequested
标志并返回。该标志由工作线程检查(最坏情况下每隔几秒检查一次)。
一切正常,但目前父应用无法确定 Worker 是否已完成关闭。
我可以看到很多解决方法,但不确定最好的方法是什么。
- 将
State
属性添加到IWorker
。应该可行,但我将要轮询状态,这似乎有点令人讨厌。 - 阻止关闭命令 - 可能是我理想的解决方案,但我不确定如何实现它 - worker
Sunclock
是一个私有(private)对象吗Shutdown()
设置标志后还应该尝试同步时钟吗? - 还有别的吗?
感谢任何文章、意见或建议。 C# 或 VB 中的示例都可以。
最佳答案
如果您希望关闭是一个阻塞操作,我不会尝试使用锁定来阻塞 Shutdown()
。
如果您可以使用 .NET 4,我会将您的内部执行方法设为任务。然后您可以调用 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
关于c# - 协调工作线程关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7968962/