この質問の後、ASP.NET MVCで非同期操作を使用するときに快適になります。それで、私はそれに2つのブログ投稿を書きました:
ASP.NET MVCでの非同期操作に関する誤解が多すぎます。
私はいつもこの文章を聞きます:操作が非同期で実行されれば、アプリケーションはより良くスケールできます
そして、私はこの種の文章もたくさん聞いた:大量のトラフィックがある場合は、クエリを非同期に実行しない方がいいかもしれません-1つのリクエストを処理するために2つの追加スレッドを消費すると、他の受信リクエストからリソースが奪われます。
この2つの文は一貫していないと思います。
ASP.NETでスレッドプールがどのように機能するかについてはあまり情報がありませんが、スレッドプールのスレッドのサイズには制限があることを知っています。したがって、2番目の文はこの問題に関連している必要があります。
また、ASP.NET MVCの非同期操作で.NET 4のThreadPoolのスレッドが使用されているかどうかを知りたいのですが。
たとえば、AsyncControllerを実装すると、アプリはどのように構成されますか?大量のトラフィックが発生した場合、AsyncControllerを実装することは良い考えですか?
この黒いカーテンを目の前に置いて、ASP.NET MVC 3(NET 4)での非同期に関する取引について説明してくれる人はいますか?
編集:
以下のドキュメントをほぼ数百回読みましたが、主要な取引は理解していますが、一貫性のないコメントが多すぎるため、混乱しています。
編集:
以下のようなコントローラアクションがあるとしましょう(AsyncController
ただし、実装ではありません)。
public ViewResult Index() {
Task.Factory.StartNew(() => {
//Do an advanced looging here which takes a while
});
return View();
}
ご覧のように、私は作戦を発動し、それを忘れます。その後、完了するのを待たずにすぐに戻ります。
この場合、これはスレッドプールのスレッドを使用する必要がありますか?もしそうなら、それが完了した後、そのスレッドはどうなりますか?DOESはGC
で来て、それが完了した直後にクリーンアップ?
編集:
@Darinの答えとして、データベースと通信する非同期コードのサンプルを次に示します。
public class FooController : AsyncController {
//EF 4.2 DbContext instance
MyContext _context = new MyContext();
public void IndexAsync() {
AsyncManager.OutstandingOperations.Increment(3);
Task<IEnumerable<Foo>>.Factory.StartNew(() => {
return
_context.Foos;
}).ContinueWith(t => {
AsyncManager.Parameters["foos"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<Bars>>.Factory.StartNew(() => {
return
_context.Bars;
}).ContinueWith(t => {
AsyncManager.Parameters["bars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
Task<IEnumerable<FooBar>>.Factory.StartNew(() => {
return
_context.FooBars;
}).ContinueWith(t => {
AsyncManager.Parameters["foobars"] = t.Result;
AsyncManager.OutstandingOperations.Decrement();
});
}
public ViewResult IndexCompleted(
IEnumerable<Foo> foos,
IEnumerable<Bar> bars,
IEnumerable<FooBar> foobars) {
//Do the regular stuff and return
}
}