c# - 将任何给定的函数转换为可等待的任务

标签 c# async-await task-parallel-library

以下代码的目标是将任何给定函数转换为可等待函数。这个想法是在从数据库中获取数据时使用它,从而使代码可以灵活地使用同步获取函数(我当前 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/

相关文章:

c# - 从父子任务返回值

c# - 两个 if 条件或一个 if 与 OR

c# - WPF 如何处理带空格的属性名称?

c# - 使用任务并行库构建任务处理管道

c# - 分配给 AES 对象的 key 和 IV 的目的是什么?

c# - 将 Socket.ReceiveAsync 替换为 NetworkStream.ReadAsync(可等待)

javascript - 如何调用异步函数作为响应

c# - Parallel.ForEach 和无法从关闭的 TextReader 异常中读取

c# - 在c#中使用async和await时UI将被阻塞

c# - 如何中止 .NET 任务?