2010-03-01 4 views
3

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

private Thread threadForWycena; 

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

Затем, когда пользователь хочет закрыть одну из ГИП я была проверка на эту тему, и если это было на мне было dissalowing, чтобы закрыть его.

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, так что я могу предотвратить закрытие окна и я могу сказать пользователю, какой поток все еще жив, а что он делает?

ответ

3

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

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

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

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 класс задач (и подтипов) обеспечивает гораздо более богатую модель для запуска кода в threadpool, включая возможность прямого возврата результатов или продолжить выполнение другой задачи.

+0

Так что на самом деле это сложнее, если использовать его без пула. Просто задайтесь вопросом, будет ли он выглядеть «ламе» для использования многих «частных потоков threadForWycena;» (конечно, с другим именем вместо пула. Мне легче узнать, что происходит, что работает, а что нет. функция запуска не запускается снова, пока не закончится старая. – MadBoy

1

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

+0

И как использовать его правильно, учитывая пример, который я дал? – MadBoy

 Смежные вопросы

  • Нет связанных вопросов^_^