【发布时间】:2015-11-09 19:41:04
【问题描述】:
以下代码的目标是将任何给定函数转换为可等待函数。这个想法是在从数据库中获取数据时使用它,让代码可以灵活地使用同步获取函数(我当前的 ORM 的强制执行),或者使用与异步相同的函数。
我知道代码背后的概念可能有很多问题。到目前为止,我只是想摆脱编译器错误,这样我就可以运行代码并检查行为。但是,我当然愿意事先讨论这个概念,如果它背后的整个想法是错误的,那么可以更有效地利用我的时间寻找另一个解决方案。
async static void Main()
{
// The following line gives a compiler error:
// Error 1 The best overloaded method match for 'CastFuncToTask<int>(System.Func<int>)' has some invalid arguments
int task = await CastFuncToTask<int>(TestFunc(2));
}
private static Task<T> CastFuncToTask<T>(Func<T> func)
{
TaskCompletionSource<T> taskCompletionSource = new TaskCompletionSource<T>();
T result = func.Invoke();
taskCompletionSource.SetResult(result);
return taskCompletionSource.Task;
}
private static int TestFunc(int testInt)
{
return testInt * 2;
}
【问题讨论】:
-
FWIW 在.Net4.5及以上你的
CastFuncToTask可以简单写成return Task.FromResult(func()); -
这种方法比标准
var result = await Task.Run(() => TestFunc(2));更好吗? -
@Sinatr 是的。
Task.Run当你知道你当前的线程只是要等待时,不必要地启动新的/现有的线程来工作。让你当前的线程工作,不要打扰线程池 :) -
@SriramSakthivel 好的,所以基本上我正在尝试重新发明轮子,
return Task.FromResult(func());正是我想要的。好的。Task.Run“新线程”问题是我试图准确避免的问题,我的印象是,在搜索“如何使自定义函数等待”时,这是“最明显”的答案。我很高兴知道有一个内置函数可以满足我的需要。 -
@SriramSakthivel, “不必要” - 如果没有在单独的线程中启动同步方法,
await没有意义,它仍然同步调用方法(阻塞调用者线程,例如 UI 线程),所以我不是真的明白await Task.FromResult()的意思。这对我来说没有意义。我知道它可以用在假设返回Task<bool>的方法中,你可以做一些检查if(someconditionfail) return Task.FromResult(false);而不是尝试调用异步方法。
标签: c# async-await task-parallel-library