协调工作线程关闭
本文关键字:线程 工作 协调 | 更新日期: 2023-09-27 18:13:05
我有一个List(Of IWorker)
,其中包含一些混凝土。IWorker
依次有Startup()
和Shutdown()
法
在Worker类中,Startup()
创建一个新的Worker线程然后返回。Shutdown()
目前设置一个私有的ShutDownRequested
标志并返回。该标志由工作线程检查(最坏每隔几秒)。
这些都可以正常工作,但是目前父应用无法确定Worker是否已经完成关闭。
我可以看到很多方法,但我不确定什么是最好的。
- 将
State
属性添加到IWorker
。应该可以,但是我要在各州投票,这看起来有点讨厌。 - 使关闭命令阻塞-可能是我理想的解决方案,但我不确定如何实现它-工作
Sunclock
是Shutdown()
设置标志后也应该尝试同步的私有对象吗? - 别的吗?
任何文章,建议或建议表示感谢。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();
}