代码之家  ›  专栏  ›  技术社区  ›  flavour404

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

  •  0
  • flavour404  · 技术社区  · 15 年前

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

    observator\u DoObserving函数调用ocr应用程序,等待响应,然后对其进行适当的处理,最后将observator=null。那么我如何创建多个“observer”线程实例呢。当然,我立刻想到了一个类结构,这是一个合适的方法还是有其他适合线程的方法。

    谢谢,R。

    3 回复  |  直到 15 年前
        1
  •  2
  •   LukeH    15 年前

    你可以使用线程池,特别是 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
    }
    
        2
  •  1
  •   Jim Mischel    15 年前

    如何处理这个问题在很大程度上取决于后台线程在完成时是否需要与主线程通信。如果背景线程真的是“fire and forget”,那么没有什么特别的原因需要维护对观察者的引用。所以你可以写:

    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 属性)。

        3
  •  0
  •   Andrew Barber Eric Lafortune    15 年前

    在某种程度上,您似乎在问,是否应该创建一个类来保存一些指示线程状态或正在处理的数据。这是完全合适的,只要对象不是一个'昂贵'的一个创建。(例如,不要创建异常对象并一直抛出它们)。