2016-05-29 21 views
1

最近私はQueueBackgroundWorkItemクラスに潜入していましたが、私は理解できないサンプルを見つけました。QueueBackgroundWorkItem内のタスクを使用

ActionまたはFuncが実行され、新しいスレッドまたはタスクを手動で作成する必要がない、新しいスレッドをQueueBackgroundWorkItemが作成することを理解します。

しかし、私は(hereからコピーされた)このように、実行アクション内の新しいタスクの作成を参照してください多くのサンプル:

using System.Web.Mvc; 
using System.Web.Hosting; 
using System.Threading; 
using System.Threading.Tasks; 
using System.Diagnostics; 
using System; 

namespace MyApp.Controllers 
{ 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     //Sample 1 
     //Action overload 
     //with lambda expression 
     HostingEnvironment.QueueBackgroundWorkItem(
      clt => LongRunningAction(clt) 
     ); 

     //Sample 2 
     //Action overload 
     //without lambda expression 
     HostingEnvironment.QueueBackgroundWorkItem(
      (Action)LongRunningAction 
     ); 

     //Sample 3 
     //Action overload 
     //with lambda expression 
     HostingEnvironment.QueueBackgroundWorkItem(
      clt => LongRunningActionAsync(clt) 
     ); 

     //Sample 4 
     //Action overload 
     //without lambda expression 
     HostingEnvironment.QueueBackgroundWorkItem(
      await (Action)LongRunningAction 
     ); 

     return View(); 
    } 

    //Action overload's target 
    private void LongRunningAction(CancellationToken clt) 
    { 
     Task.Run(() => { Thread.Sleep(5000); 
         Debug.WriteLine("Action executed"); 
         }); 
    } 

    //Action overload's target 
    private async void LongRunningActionAsync(CancellationToken clt) 
    { 
     await Task.Run(() => { Thread.Sleep(5000); 
           Debug.WriteLine("Action async executed"); 
          }); 
    } 
} 
} 

だからアクション内部Task.Runを持っていることのポイントは何ですか?

答えて

1

ご理解の方。内部的には、HostingEnvironment.QueueBackgroundWorkItemは実行をスレッドプールに委譲します(実行を追跡するためにいくつかの登録作業を行った後)。そのため、アクションの中で別のスレッドを開始することにはメリットはありません。 メソッドが非同期であり、タスクを返さないため、ASP.NETによって実行が追跡されないため、HostingEnvironment.QueueBackgroundWorkItemの目的が完全に無効になります。

関連する問題