Вы можете использовать ManualResetEvent :
public void TaskStartMethod()
{
ManualResetEvent waitHandle = new ManualResetEvent(false);
ThreadPool.QueueUserWorkItem(o=>
{
// Perform the task here
// Signal when done
waitHandle.Signal();
});
// Wait until the task is complete
waitHandle.WaitOne();
}
По сути, метод, передающий задачу в пул потоков, должен ждать, пока она не будет завершена.
Приведенный выше код делает это, но теперь у меня есть вопрос: если ваш метод ожидает завершения задачи, то зачем вам вообще выполнять задачу в отдельном потоке?Другими словами, вы описываете последовательное выполнение кода, а не параллельное, поэтому использование ThradPool
бессмысленно.
С другой стороны, вы можете использовать отдельный делегат в качестве обратного вызова:
public delegate void OnTaskCompleteDelegate(Result someResult);
public void TaskStartMethod()
{
OnTaskCompleteDelegate callback = new OnTaskCompleteDelegate(OnTaskComplete);
ThradPool.QueueUserWorkItem(o=>
{
// Perform the task
// Use the callback to notify that the
// task is complete. You can send a result
// or whatever you find necessary.
callback(new Result(...));
});
}
public void OnTaskComplete(Result someResult)
{
// Process the result
}
Обновление (24.01.2011): Возможно, вам даже не понадобится делегат обратного вызова, вы можете просто напрямую позвонить OnTaskComplete
, и это тоже должно сделать эту работу:
public void TaskStartMethod()
{
ThradPool.QueueUserWorkItem(o=>
{
// Perform the task
// Call the method when the task is complete
OnTaskComplete(new Result(...));
});
}