2016-05-29 89 views
1

我最近潛入QueueBackgroundWorkItem課,並且偶然發現了我不明白的樣本。在QueueBackgroundWorkItem中使用任務

我的理解是,QueueBackgroundWorkItem會創建一個新線程,其中執行給定的ActionFunc,並且不需要手動創建新的線程或任務。

然而,許多樣品我看到創建執行行動中的新任務,像這樣的(從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將執行委託給線程池(在執行一些各種註冊工作以跟蹤執行之後),因此在動作中啓動另一個線程沒有任何好處。 它甚至擊敗了HostingEnvironment.QueueBackgroundWorkItem的全部目的,因爲這些方法是異步的,但不返回任務,因此ASP.NET不會跟蹤執行。