2

是否有一种优雅的方法可以知道工作线程何时完成执行,以便我可以访问它产生的资源?

例如,如果工作线程使用以下方式查询 SQL Server 列表

ServersSqlDataSourceEnumerator.Instance.GetDataSources();

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

谢谢!

4

5 回答 5

5

您可以使用回调机制或阻止事件来了解异步操作的完成。请参阅此页面以了解 .net 中的异步编程模型- 您可以在任何委托上调用 BeginInvoke 以异步方式执行操作。

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

于 2009-06-03T14:37:25.957 回答
1

在这种情况下,我所做的是让 WorkerThread 在完成工作后调用一个函数,该函数将调用 UI 线程,它可以完成您需要的工作。

例如

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,它带有它自己的事件,这些事件在工作完成时被触发。但是,如果您需要使用线程,我会查看异步回调或与上面显示的类似路由。

于 2009-06-03T14:43:51.327 回答
1

您可以在此SO 线程上查看我的答案

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

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

希望这可以帮助 :)

于 2009-06-03T17:33:49.780 回答
1

所以触发一个事件:-P

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

于 2009-06-03T14:36:21.920 回答
0

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

于 2009-06-03T14:37:56.987 回答