以下代码的目标是将任何给定函数转换为可等待函数。这个想法是在从数据库中获取数据时使用它,从而使代码可以灵活地使用同步获取函数(我当前 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;
}
最佳答案
运行 .NET 4.5,您可以通过以下方式大大简化您的代码:
int task = await Task.FromResult(TestFunc(2));
无需自己将其包装在 TaskCompletionSource
中。
I am aware that there could be many things wrong with the concept behind code.
如果您尝试做的是异步查询您的数据库,那么此解决方案肯定无济于事。它只是人为地将您的结果包装在 Task
中。如果你真的想异步查询你的数据库,你需要使用你的数据库提供商提供的异步方法。
如果您正在使用 MySQL 并正在寻找支持异步的驱动程序,请查看 Dapper
关于c# - 将任何给定的函数转换为可等待的任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32045815/