代码之家  ›  专栏  ›  技术社区  ›  Mark Carpenter

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

  •  2
  • Mark Carpenter  · 技术社区  · 15 年前

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

    例如,如果工作线程使用

    ServersSqlDataSourceEnumerator.Instance.GetDataSources();

    并将结果保存在数据表变量中,我可以使用什么机制来知道这个数据表变量何时被填充/可用。我不想对threadstate进行投票;最好在事件完成后触发事件,这样我就可以使用结果执行操作。

    谢谢!

    5 回复  |  直到 15 年前
        1
  •  5
  •   Gishu    15 年前

    可以对事件使用回调机制或块来了解异步操作的完成情况。有关 Asychronous Programming Model in .net -可以对任何委托调用BeginInvoke以异步方式执行操作。

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

        2
  •  1
  •   Joel Martinez    15 年前

    所以启动一个事件:

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

        3
  •  1
  •   Lloyd Powell binku    15 年前

    在这个实例中,我要做的是让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();
      }
    }
    

    如果这是你正在使用的一个简单的过程,我会选择一个后台工作线程,它会在工作完成后触发自己的事件。但是如果您需要使用一个线程,我将查看异步回调或类似于上面所示的路由。

        4
  •  1
  •   Community leo1    7 年前

    你可以查一下我的答案 SO thread

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

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

    希望这有帮助:)

        5
  •  0
  •   Olivier Pons    15 年前

    我没有用C语言编程,但这里是我用Delphi做的,也许你也可以用C语言编程。 我有一个三个后代,在“毁灭”事件中,我给它的创造者发了一条信息,说“嘿,我快死了!”. 这样,如果它需要一个新的线程,它的父线程(即主线程)就会创建一个新的线程。准确地说,它启动一个计时器,当被激发时,如果需要一个新线程,它会创建一个新线程(站点吸吮时间(LOL)!!)。