C# 对ReplaceDocumentSync方法的调用无法返回

C# 对ReplaceDocumentSync方法的调用无法返回,c#,asynchronous,async-await,azure-cosmosdb,C#,Asynchronous,Async Await,Azure Cosmosdb,在web上下文(IIS)中运行时,我没有收到来自async DocumentDB ReplaceDocument方法的响应。在本地运行时,它工作正常。根据我的研究,这似乎与UI线程的冲突死锁有关 我从其他异步调用中得到了很好的响应,例如: this.Client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(this.DatabaseName)).Result; // and this.Client.CreateDatabaseAsync(new

在web上下文(IIS)中运行时,我没有收到来自async DocumentDB ReplaceDocument方法的响应。在本地运行时,它工作正常。根据我的研究,这似乎与UI线程的冲突死锁有关

我从其他异步调用中得到了很好的响应,例如:

this.Client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(this.DatabaseName)).Result;
// and
this.Client.CreateDatabaseAsync(new Database { Id = this.DatabaseName }).Result;
// etc
我没有使用wait,因为在IIS上下文中,它似乎永远不会响应。我不知道为什么,所以我删除了所有的异步等待,并开始使用
.Result
,现在除了下面的方法之外,所有的东西都工作了

根据这个问题。我已经设置了
ConfigureAwait(false)
,正在调用
GetResult()
。但是该方法不返回,线程最终关闭而不返回

var task = this.Client.ReplaceDocumentAsync(this.GetDocumentLink(d.id), d, options);
var configuredTask = task.ConfigureAwait(false);
var awaiter = configuredTask.GetAwaiter();
var result = awaiter.GetResult();
我还尝试了以下排列方式:

// in a spereate async method
await this.Client.ReplaceDocumentAsync(this.GetDocumentLink(d.id), d, options);
await this.Client.ReplaceDocumentAsync(this.GetDocumentLink(d.id), d, options).ConfigureAwait(false);

// as well as trying a call back
.GetAwaiter().OnCompleted(() => /* never gets here either */);
编辑

我在我的
Web.config
(via:)中有这个


我相信你看到了我在博客上描述的内容

最好的解决方案不是在任何地方使用
ConfigureAwait(false)
来避免它,因为它必须在任何地方使用。因此,如果您忘记了一个地方,或者如果有一些库代码没有使用它(这是很常见的),那么您就无法避免死锁

最好的解决方案是使用
wait
。将对
Task.Wait()
Task.Result
Task.GetAwaiter().GetResult()
的每次调用替换为
Wait

await this.Client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(this.DatabaseName));
await this.Client.CreateDatabaseAsync(new Database { Id = this.DatabaseName });

var result = await this.Client.ReplaceDocumentAsync(this.GetDocumentLink(d.id), d, options);
我没有使用wait,因为在IIS上下文中,它似乎永远不会响应


请确保您的目标是.NET 4.5,并且在
web.config
中已将
targetFramework
设置为4.5。我相信您看到了我在我的博客上描述的

最好的解决方案不是在任何地方使用
ConfigureAwait(false)
来避免它,因为它必须在任何地方使用。因此,如果您忘记了一个地方,或者如果有一些库代码没有使用它(这是很常见的),那么您就无法避免死锁

最好的解决方案是使用
wait
。将对
Task.Wait()
Task.Result
Task.GetAwaiter().GetResult()
的每次调用替换为
Wait

await this.Client.ReadDatabaseAsync(UriFactory.CreateDatabaseUri(this.DatabaseName));
await this.Client.CreateDatabaseAsync(new Database { Id = this.DatabaseName });

var result = await this.Client.ReplaceDocumentAsync(this.GetDocumentLink(d.id), d, options);
我没有使用wait,因为在IIS上下文中,它似乎永远不会响应


请确保您的目标是.NET 4.5,并且在
web.config

中已将
targetFramework
设置为4.5。在我的情况下,出现了类似的任务取消/错误、显示为“DictionaryError”的内部异常或聚合异常。至少我发现导致这个问题的主要原因是使用了http:///的CosmosDb emulator的端点。更改后,一切都开始工作。

在我的案例中,出现了类似的任务取消/错误、内部异常显示为“DictionaryError”或聚合异常。至少我发现导致这个问题的主要原因是使用了http:///的CosmosDb emulator的端点。更改后-一切都开始工作。

我添加了我的web配置,而且,我将尝试自上而下的异步,我是从一个WebAPI运行的,在我进行300行更改之前,有什么需要担心的吗?@ohmusama:如果你有同步API可用,更改为全程同步可能会更快。我认为问题在于documentDb库中的
replaceDocumentSync
可能未使用ConfigureWait(false),因此我无法等待。可能是打字错误。我将对它进行反编译并检查。他们使用
await TaskHelper调用一个helper类。inlineifmable(另一个任务)
内部可能会等待,也可能不会等待,这可能就是我得到不一致结果的原因。我在过程中进行了一些反思,使用Invoke(),使用
ContinueWith
解决了它,谢谢!我添加了我的web配置,而且,我将尝试一下自上而下的异步,我是从一个WebAPI运行的,在我开始进行300行的更改之前,有什么我应该担心的吗?@ohmusama:如果你有同步API可用,更改为全程同步可能会更快。我认为问题在于documentDb库中的
replaceDocumentSync
可能未使用ConfigureWait(false),因此我无法等待。可能是打字错误。我将对它进行反编译并检查。他们使用
await TaskHelper调用一个helper类。inlineifmable(另一个任务)
内部可能会等待,也可能不会等待,这可能就是我得到不一致结果的原因。我在过程中进行了一些反思,使用Invoke(),使用
ContinueWith
解决了它,谢谢!