То, что вы пытаетесь сделать прямо сейчас, не асинхронно;если вы хотите вернуть T
, просто используйте:
return actionFunction();
Это будет меньше накладных расходов.
Если вы хотите асинхронно, и вы на 4.0, тогда TPL может быть хорошим вариантом:
public Task<T> BeginInvokeExWithReturnValue<T>(Func<T> actionFunction)
{
var task = new Task<T>(actionFunction);
task.Start();
return task;
}
Теперь вызывающая сторона может использовать:
var task = BeginInvokeExWithReturnValue(() => Whatever());
, а затем, при желании, проверить завершение, заблокировать (Wait
) длязавершение, регистрация продолжений и т. д. Или просто:
var result = task.Result; // implicit wait
Console.WriteLine(result);
Это позволяет без проблем писать асинхронный код.Или в C # 5.0 легко написать продолжение:
var result = await task; // continuation - this is **not** a wait
Console.WriteLine(result);