如何在不轮询ThreadState的情况下判断线程是否已完成执行?

时间:2009-06-03 14:33:05

标签: c# .net multithreading worker-thread

是否有一种优雅的方式来了解工作线程何时完成执行,以便我可以访问它生成的资源?

例如,如果工作线程使用

查询SQL Server列表

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

并将结果保存在DataTable变量中,我可以使用什么机制来了解此DataTable变量何时已填充/可用。我不想轮询ThreadState;在事件完成时触发事件是理想的,这样我就可以对结果执行操作。

谢谢!

5 个答案:

答案 0 :(得分:5)

您可以对事件使用回调机制或阻止来了解异步操作的完成情况。请参阅此页面了解Asychronous Programming Model in .net - 您可以在任何委托上调用BeginInvoke以异步方式执行操作。

如果您使用的是BackgroundWorker类型,则可以订阅RunWorkerCompleted event

答案 1 :(得分:1)

所以发动一个事件:-P

您还可以查看使用AutoResetEvent:
http://msdn.microsoft.com/en-us/library/system.threading.autoresetevent.aspx

答案 2 :(得分:1)

我在这个例子中做的是让WorkerThread在完成工作后调用一个函数,它将调用UI Thread,它可以完成你需要的工作。

E.g。

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或类似于上面显示的路径。

答案 3 :(得分:1)

您可以在SO thread

上查看我的答案

它使用回调机制。异步操作完成后,它将触发回调方法,您可以在其中处理SQL执行后需要完成的处理。

使用类似的方法在异步操作完成时得到通知。

希望这会有所帮助:)

答案 4 :(得分:0)

我不用C#编程,但这是我用Delphi做的,也许你可以用C#做​​。 我有一个TThread后代,在“破坏”事件中,我向其创建者发送一条消息,说“嘿,我快死了!”。 这样它的父(它是主线程)如果需要一个新线程就会创建一个新线程。确切地说,它启动一个计时器,当被触发时,如果需要一个新的线程,则会创建一个新线程(网站吸时间(lol)!!)。