私の望みは、長期実行のI/O操作を非同期に行うMVCコントローラのアクションを作成することです。私の目標は、この長時間実行されるメソッドが完了している間にASP.Netスレッドプール内のスレッドを縛るのを避けることです。ASP.Net MVCコントローラの動作方法非同期
アクションは2回コールします。
最初の呼び出しは、非同期メソッドを含まないサードパーティ製のdllです。このdllは、独自のデータベースから読み取り、かなり複雑なCPUバウンド処理を行います。それは戻ってくるのに数秒かかることがあります。
2番目の呼び出しでは、最初の呼び出しの結果が、Entity Frameworkを使用してデータベースクエリに渡されるパラメータとして使用されます。私は3rdPartyComponentのawaitableに電話をしたいと思い
public async Task<ActionResult> MyActionAsync(arg1, arg2)
{
var parameters = 3rdPartyComponent.TakesLongTime(arg1, arg2);
Task<List<MyClass>> genericList = null;
using (DbContexts.MyDbContext db = new DbContexts.MyDbContext())
{
genericList = await db.Database.SqlQuery<MyClass>(sql,parameters).ToListAsync();
}
return View("MyView", genericList);
}
:
簡体字、これはアクションです。私の最初のアイデアは、これを行うことだった。
var parameters = await Task.Run(() => 3rdPartyComponent.TakesLongTime()).ConfigurateAwait(false);
を私はいくつかの主題の専門家がTask.Runを(使用していることを断固述べる読んだ)asp.net MVCアクション内部の反生産的であると行われるべきではありません。
3rdPartyComponentはコンパイルされたコードの黒いボックスで、非同期メソッドを追加するために変更することはできません。
3rdPartyComponentの呼び出しを待つことができる方法はありますか?そのため、アクション全体がasp.netスレッドプール内のスレッドを縛らずに実行されますか?
* asp.net MVCアクション内のTask.Run()は生産性が悪く、決して実行しないでください*。これは真実ではありません。あなたがこれをやりたいことがあるかもしれない多くの場合があります。私はあなたがこれをいつもしなければならないと言っているわけではありませんが、別スレッドを生成したい場合はどうしてですか? – Liam
こんにちはTom、これを読んでください:http://blog.stephencleary.com/2013/08/startnew-is-dangerous.htmlそして、あなたがあなたの最適化において時期尚早であるかどうかを検討してください。交通量の多い方法では、これが不要なステップである可能性は確かです。 (おそらくTask.Factory.StartNewを使用して、ThreadPoolの作業をスケジュールするためにTaskCreationOptionsを提供できるようになるでしょう) – spender
@spender、これは大量のトラフィックの方法です。 –