我有一个异步
方法:
public async Task<string> GenerateCodeAsync()
{
string code = await GenerateCodeService.GenerateCodeAsync();
return code;
}
我需要从一个同步方法调用这个方法。
我怎样才能做到这一点而不必复制 GenerateCodeAsync
方法以使其同步工作?
更新
目前还没有找到合理的解决方案。
但是,我看到 HttpClient
已经实现了这个模式
using (HttpClient client = new HttpClient())
{
// async
HttpResponseMessage responseAsync = await client.GetAsync(url);
// sync
HttpResponseMessage responseSync = client.GetAsync(url).Result;
}
最佳答案
您可以访问任务的 Result
属性,这将导致您的线程阻塞,直到结果可用:
string code = GenerateCodeAsync().Result;
注意:在某些情况下,这可能会导致死锁:您对 Result
的调用会阻塞主线程,从而阻止异步代码的其余部分执行。您可以选择以下选项来确保不会发生这种情况:
在线程池线程中显式执行您的异步方法并等待它完成:
string code = Task.Run(() => GenerateCodeAsync).Result;
这并不意味着您应该在所有异步调用之后无意识地添加.ConfigureAwait(false)
!有关为什么以及何时应该使用 .ConfigureAwait(false)
的详分割析,请参阅以下博客文章:
关于c# - 同步调用异步方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22628087/