Потоки, как создать несколько потоков без использования структуры классов - PullRequest
0 голосов
/ 17 сентября 2010

То, что у меня есть, это цикл чтения некоторых данных, и когда встречаются обстоятельства, мне нужно создать поток.Однако созданный поток может не завершиться до того, как будут выполнены критерии цикла, и мне нужно создать другой поток, выполняющий то же самое.Это часть ocr-приложения, и я до сих пор не проделал большую работу с потоками.

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

Функция наблюдателя_DoObserving вызывает приложение ocr, ожидает ответ, а затем обрабатывает его соответствующим образом и устанавливает для наблюдателя = нольконец.Итак, как бы я создал несколько экземпляров потока «наблюдателя».Конечно, сразу же я подумал о структуре класса, это подходящий способ сделать это или есть другой способ, который подходит для многопоточности.

Надеюсь, это имеет смысл.

Спасибо, R.

Ответы [ 3 ]

2 голосов
/ 17 сентября 2010

Вы можете использовать пул потоков, в частности 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 голос
/ 17 сентября 2010

То, как вы справляетесь с этим, во многом зависит от того, нужно ли фоновому потоку сообщать что-либо основному потоку после его завершения. Если фоновым потоком действительно является «запустить и забыть», то нет особой причины, по которой вам нужно поддерживать ссылку на наблюдателя. Чтобы вы могли написать:

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.

0 голосов
/ 17 сентября 2010

Я не совсем могу понять, что именно вы делаете, поэтому я могу или не могу быть полезен здесь;

Вы, похоже, частично спрашиваете, уместно ли создать класс для хранениянекоторые данные, указывающие на состояние потока или над чем он работает.Это вполне уместно, если объект не является «дорогим» для создания.(например, не создавать объекты Exception и не перекидывать их все время).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...