线程化,如何在不使用类结构的情况下实例化多个线程

时间:2010-09-17 00:28:47

标签: c# multithreading visual-studio-2008

我所拥有的是读取某些数据的循环,当满足一组环境时,我需要实例化一个线程。但是,在满足循环条件之前,创建的线程可能无法完成,我需要创建另一个执行相同操作的线程。这是ocr应用程序的一部分,我之前没有做太多的线程工作。

while loop
  if(criteria)
  {
    observer = new BackgroundWorker();
    observer.DoWork += new DoWorkEventHandler(observer_DoObserving);
    observer.RunWorkerAsync();
  }

observer_DoObserving函数调用ocr应用程序,等待响应然后适当地处理它并在结尾处设置observer = null。那么我将如何创建'observer'线程的多个实例。当然我立刻想到了一个类结构,这是一个合适的方法,还是有另一种适合线程的方法。

我希望这是有道理的。

谢谢,R。

3 个答案:

答案 0 :(得分:2)

您可以使用线程池,特别是ThreadPool

while (something)
{
    if (criteria)
    {
        // QueueUserWorkItem also has an overload that allows you to pass data
        // that data will then be passed into WorkerMethod when it is called
        ThreadPool.QueueUserWorkItem(new WaitCallback(WorkerMethod));
    }
}

// ...

private void WorkerMethod(object state)
{
    // do work here
}

答案 1 :(得分:1)

如何处理这在很大程度上取决于后台线程在完成后是否需要与主线程进行任何通信。如果后台线程确实是“火上浇油”,那么就没有特别的理由需要维护对观察者的引用。所以你可以写:

while loop
{
  if(criteria)
  {
    BackgroundWorker observer = new BackgroundWorker();
    observer.DoWork += new DoWorkEventHandler(observer_DoObserving);
    observer.RunWorkerAsync();
  }
}

线程完成其工作并消失。 observer是一个局部变量,当执行离开if块时,该变量超出范围。如果必须在第一个观察者线程完成之前启动另一个观察者线程,则无法覆盖该变量。

如果您需要跟踪单个观察者的信息,那么您将创建一个某种类型的对象(您定义的类),其中包含有关该工作者状态的信息,并将其传递给RunWorkerAsync方法。然后,工作人员可以修改该对象并向您发送进度通知(请参阅ProgressChanged事件和ReportProgress方法),并在工人完成时报告状态(请参阅RunWorkerCompleted,传递给RunWorkerAsync的状态对象将位于RunWorkerCompletedEventArgs.UserState属性中。

答案 2 :(得分:0)

我无法完全理解你在做什么,所以我在这里可能会有所帮助;

您似乎在某种程度上询问是否适合创建一个类来保存一些数据,以指示线程的状态或它正在处理的内容。如果对象不是一个“昂贵的”创建对象,这是完全合适的。 (例如,没有创建Exception对象并一直抛出它们。)