将函数包装为异步任务

Wrap a function as an async task

我想包装一个函数,以便我可以使用 async/await 模式:

wcfClientService.GetSomeString(parameter);

这是一个来自 WCF 客户端的调用,我试图将其设为异步,但这并不重要(我知道 WCF 支持异步,但假设我们无权访问 WCF 代码)。

我正在尝试用 Task<T>.Factory.FromAsync 方法包装该方法,但似乎无法正确处理:

private Task<string> WrapWcfServiceAsyncTask(uint parameter)
{
    Func<uint, string> func = i => { return wcfClientService.GetSomeString(parameter); };

    var t = Task<string>.Factory.FromAsync(
                                           // What goes here?
                                          );
    return t;
}

或者更好的是,有人可以编写一个方法,将方法作为参数,并为它包装 returns 一个 Task<T> 吗?

您要做的是 async over sync。你有一个同步操作,你想假装它是异步的。

你可以用 Task.Run:

var result = await Task.Run(() => wcfClientService.GetSomeString(parameter));

但这毫无意义,因为您只是将工作从一个 ThreadPool 线程卸载到另一个线程。

如果你想要一个异步操作,它需要以某种方式开始异步,或者使用 async-await 或 Begin/End,等等。

如果您有 BeginGetSomeString/EndSomeString 已经是异步的,您可以使用 FromAsync 将其变成异步等待。

如果您使用现代版本的 Visual Studio 重新生成 WCF 代理,它应该默认生成 task-returning asynchronous methods。请注意,WCF 服务根本不需要更改;只有客户端代理需要更新。

然后你可以用普通的方式调用它的方法await;不需要 Task.Run:

private async Task<string> WrapWcfServiceAsyncTask(uint parameter)
{
  return await wcfClientService.GetSomeStringAsync(parameter);
}