ASP.NET MVCアプリケーションには3つのレイヤーがあります。最初のレイヤーから、私は2番目のレイヤーでメソッドを呼び出しています。このメソッドは、3番目のレイヤーで、Webサービスを呼び出します。以下はコードです。両方の層(2および3)を溶液中にClass Library
として加える。デッドロック待機中結果
namespace Web.Controllers // Layer 1
{
using Web.Services;
// other usings...
public class Controller1
{
[HttpPost]
public JsonResult Search(SomeObject request)
{
Service service = new Service();
var result = service.Search(request).Result;
}
}
}
namespace Web.Service // Layer 2
{
using Web.Library;
// other usings...
public class Service
{
public async Task<SomeType> SearchFlights(SomeObject requestModel)
{
SomeObjectReturn result = new SomeObjectReturn();
Library library = new Library();
var result = await library.Search(requestModel);
return result;
}
}
}
namespace Web.Library // Layer 3
{
public class Library
{
public async Task<SomeObjectReturn> Search(SomeObject request)
{
// here I call Sabre service to get the result...
SomeObjectReturn obj = new SomeObjectReturn();
RestClient restClient = RestClientFactory.Create();
IActivity activity = new InstaFlightsActivity(restClient, requestModel);
Sabre.Library.Workflow.Workflow workflow = new Sabre.Library.Workflow.Workflow(activity);
SharedContext sharedContext = await workflow.RunAsync();
// map sharedContext to SomeObjectReturn
return obj;
}
}
}
ここで、デッドロックがawait workflow.RunAsync
にある理由はわかりません。私はまた、に.ConfigureAwait(false)
を試しました。とにかくデッドロックが発生しています。コードに何が問題なのか分かりません。
ところで、私はController
に以下のように変更を加えました。結果が出ました。
public async Task<JsonResult> Search(SomeObject request) {...
の代わりに、
'.Resul'と' .Wait() 'は*ブロッキング*コールです。 –
_私は何がコードに間違っているのか分かりません.'Result'を使うことで、あなたのコードは、スレッドがhisselfの完了を待っている状態になります。呼び出しメソッドは、タスクが完了したときに待機し、完了したタスクはスレッドがアイドル状態になるのを待って完了を通知します。 – Fabio
2つのコメント:1.すべての 'ASP.NET'コントローラは' Controller'または 'ApiController'(web apiの場合)から継承しなければなりません。 2.すべてのコントローラのアクションは '非同期タスク 'でなければなりません。' –