C # ThreadPool ждать результата - PullRequest
2 голосов
/ 25 января 2012

Я хочу иметь функцию к чему-то похожему:

public static V callAsyncAndWait<V>(Func<V> func)
{
    ThreadPool.QueueUserWorkItem(obj => 
    {
        V v = func.Invoke();                 
    });

    return v;
}

Очевидно, этот код не компилируется. Я хочу запустить Func в другом потоке и вернуть результат. Как я могу это сделать?

Ответы [ 3 ]

3 голосов
/ 25 января 2012

Я рекомендую вам использовать новый класс .NET 4.0 Task.Вот учебник о том, как вернуть результат выполнения Task: http://msdn.microsoft.com/en-us/library/dd537613.aspx

Практически у вас есть очень удобное свойство, называемое Result, которое при вызове геттера будет блокироваться дорезультат доступен.

2 голосов
/ 25 января 2012

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

Что-то вроде "call async и notify когда будет выполнено" будет иметь больше смысла:

void CallAsyncAndNotifyWhenDone<T>(Func<T> func, Action<T> callback)
{
    ThreadPool.QueueUserWorkItem(obj => 
    {
        T result = func();         
        callback(result);
    });
}
1 голос
/ 25 января 2012

Вы можете использовать async patternt для этого:

public static V callAsyncAndWait<V>(Func<V> func)
{
  var asyncResult = func.BeginInvoke(null, null);

  asyncresult.AsyncWaitHandle.WaitOne();

  return func.EndInvoke(asyncResult);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...