Есть ли способ проверить, что работает в .NET Thread Pool? - PullRequest
4 голосов
/ 01 марта 2010

Обычно я создавал каждый поток для каждого действия, которое я хотел сделать многопоточным. Я делал это так:

private Thread threadForWycena;

private void someMethod() {
       threadForWycena = new Thread(globalnaWycena);
       threadForWycena.Start();
}

Затем, когда пользователь захотел закрыть один из графических интерфейсов, я проверял этот поток и, если он был включен, я отказывался закрывать его.

    private void ZarzadzajOplatamiGlobalneDzp_FormClosing(object sender, FormClosingEventArgs e)
    {
        if (threadForWycena.IsAlive) {
            MessageBox.Show("Wycena jest w toku. Zamknięcie okna jest niemożliwe.", "Brak wyjścia :-)");
            e.Cancel = true;
        }
    }

Есть ли способ сделать это с помощью ThreadPool, чтобы я мог предотвратить закрытие окна и сказать пользователю, какой поток еще жив и что он делает?

Ответы [ 2 ]

4 голосов
/ 01 марта 2010

Нет прямого способа определить, когда рабочий элемент пула потоков завершен в .NET. Однако добавить его не сложно.

  • Создать ManualResetEvent
  • В конце рабочего элемента установить это событие.
  • Чтобы проверить, завершен ли рабочий элемент, выполните нулевое время ожидания для события, чтобы увидеть, установлено ли оно.

например. (используя лямбду, чтобы закрыть событие и избежать изменения кода для запуска в пуле потоков):

var e = new ManualResetEvent(false); // false => not set to sart
ThreadPool.QueueUserWorkItem(_ => { FunctionToCall(); e.Set(); });
// Continue concurrently....
if (e.WaitOne(0)) {
  // The work item has completed
}

Кстати, в .NET 4 класс Task (и его подтипы) предоставляет гораздо более богатую модель для запуска кода в пуле потоков, включая возможность прямого возврата результатов или продолжения другой задачи.

1 голос
/ 01 марта 2010

RegisterWaitForSingleObject сообщит дескриптор ожидания, когда он завершит выполнение.

...