私はNugetパッケージEsri.ArcGISRuntimeを持っていて、私のWeb API 2コントローラの1つにメソッドQueryTask.ExecuteAsyncを呼び出す必要があります。私は私のプログラム/サービスに完璧に動作ConfigureAwait(false)でもWebAPIデッドロックで非同期メソッドを同期呼び出す
private QueryResult ExecuteSync()
{
var queryResults = ExecuteAsync();
queryResults.Wait();
return queryResults.Result;
}
private async Task<QueryResult> ExecuteQueryTaskAsync()
{
var queryTask = new QueryTask(_uri);
return await queryTask.ExecuteAsync(_query).ConfigureAwait(false);
}
のようなラッパーを使用していますマイライブラリのC#コードでのように、何の同期カウンタの一部はありません。しかし、ExecuteSync
をWeb API 2コントローラーで使用すると、これは完全にフリーズし、応答を返さないことがあります。
私はいくつかの研究を行い、犯人がここで言及されていると信じています http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html
私は絶対に非同期機能を使用する必要はありません。上記の関数は、この1つのWeb API呼び出しをサポートするためだけに、非同期メソッドをバブルアップするライブラリクラスの主要なオーバーホールであるように、4ラッパーのようにコアで隠されています。
私が上で)私は(それが
あなたは 'await'を使用しなければなりません。read [this](http://stackoverflow.com/questions/13140523/await-vs-task-wait-deadlock) – Legends
@AlexeiLevenkov私はあなたが"内部同期コンテキスト"私はそれがより多くの内容を必要とするか、公式の答えのより多くになると思うコメント。リンクdoesntは実際に私のWeb APIのコントローラの例で調整されていません。まだ回避策として何をしているのか分かりません – ParoX
あなたは既に 'ConfigureAwait(false)'を持っています...コードはデッドロックしてはいけません(タイトルが変更され、重複が間違っていました)。デッドロックが発生したときにスレッドがスタックした場所を調べることをお勧めします。また、問題がライブラリに関連していないことを確認するために、非常に基本的な非同期メソッド( 'Task.Delay(1000)')を試してください。 –