我有一个包含许多混凝土的List(Of IWorker)
。 IWorker
又有Startup()
和Shutdown()
方法。
在Worker类中,Startup()
创建一个新的工作线程然后返回。 Shutdown()
目前设置私有ShutDownRequested
标志并返回。工作线程检查该标志(最坏的情况是每隔几秒)。
这一切都运行良好,但目前父应用程序无法确定工人是否已完成关闭。
我可以看到很多方法,但我不确定最好的方法。
State
属性添加到IWorker
。应该工作,但我将轮询那些看起来有点讨厌的州。Sunclock
是一个私有对象Shutdown()
也应该在设置后尝试同步国旗?任何文章,建议或建议表示赞赏。 C#或VB中的例子很好。
答案 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();
}