如何在同步应用程序中调用 documentdb c# API

how to call documentdb c# API in a synchronous app

我正在将 documentdb 添加到现有应用程序 (~500kloc)。即使我愿意,也无法 'async all the way' 重写此应用程序。

所有 C# API 都是异步的。与这些调用同步的明显方法是 .Wait() 它们。这是几个 MS 示例应用程序所做的,但是当我之前问过类似的问题时,共识是 'do not do .wait you risk deadlocks'

我在 SO 中发现了这个确切的问题,没有答案,只有评论。一个说'do .wait',一个说'use await',一个说'you cant do it'

'use await' 没有解决问题,因为我们仍然是异步的,然后 none 这些评论提供了答案

您可以使用以下方法从 non-async 方法调用您的异步方法:

var myThread = System.Threading.Tasks.Task.Run(async () => await      
DoSomethingAsync());

然后你可以通过调用

来避免死锁
myThread.Wait();

所有 DocumentDB async API 将在存在同步上下文 (ASP/WPF/Winforms) 时使用 Task.Run 到 运行 任务。 这意味着,直接在 DocumentDB C# API.

上调用 .Result 或 .Wait 是安全的

阻塞调用(n个样本是由于在C#7之前缺少'async main'。 建议尽可能不要在您的应用程序中使用阻塞调用。