[英]How can I tell if a thread is finished executing without polling ThreadState?
是否有一种优雅的方式来了解工作线程何时完成执行,以便我可以访问它生成的资源?
例如,如果工作线程使用查询SQL Server列表
ServersSqlDataSourceEnumerator.Instance.GetDataSources();
并将结果保存在DataTable变量中,我可以使用什么机制来了解此DataTable变量何时已填充/可用。 我不想轮询ThreadState; 当事件完成时触发事件是理想的,这样我就可以对结果执行操作。
谢谢!
您可以在事件上使用回调机制或阻止来了解异步操作的完成情况。 有关.net中的异步编程模型,请参阅此页面 - 您可以在任何委托上调用BeginInvoke以异步方式执行操作。
如果您使用的是BackgroundWorker类型,则可以订阅RunWorkerCompleted事件 。
所以发动一个事件:-P
您还可以查看使用AutoResetEvent:
http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx
我在这个例子中做的是让WorkerThread在完成工作后调用一个函数,它将调用UI Thread,它可以完成你需要的工作。
例如
private void SetWorkerThreadToDoWork()
{
WorkerThread.Start();
}
private void MyWorkerThreadWork()
{
//This will be on the WorkerThread (called from WorkerThread.Start())
DoWorkFunc();
WorkComplete();
}
private void WorkComplete()
{
if(InvokeRequired == true)
{
//Do the invoke
}
else
{
//Check work done by worker thread
//e.g. ServersSqlDataSourceEnumerator.Instance.GetDataSources();
}
}
如果这是一个你正在使用的简单过程,我会选择一个BackgroundWorkerThread,它带有它自己在工作完成时触发的事件。 但是如果你需要使用一个Thread,我会查看Asynchronous Callbacks或类似于上面显示的路径。
我不用C#编程,但这是我用Delphi做的,也许你可以用C#做。 我有一个TThread后代,在“破坏”事件中,我向其创建者发送一条消息,说“嘿,我快死了!”。 这样它的父(它是主线程)如果需要一个新线程就会创建一个新线程。 确切地说,它启动一个计时器,当被触发时,如果需要一个新的线程,则会创建一个新的线程(网站吸时间(lol)!!)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.