将函数包装为异步任务
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);
}
我想包装一个函数,以便我可以使用 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);
}