如何在同步应用程序中调用 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'。
建议尽可能不要在您的应用程序中使用阻塞调用。
我正在将 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'。 建议尽可能不要在您的应用程序中使用阻塞调用。