也许我没有说清楚——情况是我有现有的代码,它不支持异步操作,我想使用支持仅异步方法的新库,例如System.Net.Http和AWS SDK。因此,我需要弥合差距,并且能够编写可以被同步调用的代码,但然后可以在其他地方调用异步方法。
我已经阅读了很多资料,有很多次这个问题被问到并得到解答。 从非异步方法调用异步方法 同步等待异步操作,以及为什么Wait()会冻结程序
问题在于大多数答案都不同!我见过最常见的方法是使用.Result,但这可能会导致死锁。我尝试了以下所有方法,它们都可以工作,但我不确定哪种方法是避免死锁、具有良好性能并与运行时(在任务调度程序、任务创建选项等方面)协调得好的最佳方法。有明确的答案吗?什么是最佳途径?
private static T taskSyncRunner<T>(Func<Task<T>> task)
{
T result;
// approach 1
result = Task.Run(async () => await task()).ConfigureAwait(false).GetAwaiter().GetResult();
// approach 2
result = Task.Run(task).ConfigureAwait(false).GetAwaiter().GetResult();
// approach 3
result = task().ConfigureAwait(false).GetAwaiter().GetResult();
// approach 4
result = Task.Run(task).Result;
// approach 5
result = Task.Run(task).GetAwaiter().GetResult();
// approach 6
var t = task();
t.RunSynchronously();
result = t.Result;
// approach 7
var t1 = task();
Task.WaitAll(t1);
result = t1.Result;
// approach 8?
return result;
}