![](/img/trans.png)
[英]Differences between QueueBackgroundWorkItem (Action <CancellationToken>) and QueueBackgroundWorkItem (Func <CancellationToken, Task>)
[英]Using Task within QueueBackgroundWorkItem
我最近正在深入研究QueueBackgroundWorkItem
类,并且偶然发现了一些我不理解的示例。
我的理解是QueueBackgroundWorkItem
新建一个线程,在其中执行给定的Action
或者Func
,不需要手动新建一个Thread或者Task。
但是,我看到的许多示例在执行的 Action 中创建了一个新任务,如下所示(从此处复制):
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");
});
}
}
}
那么在 Action 中包含Task.Run
有什么意义呢?
你的理解是正确的。 在内部, HostingEnvironment.QueueBackgroundWorkItem
将执行委托给线程池(在执行一些各种注册工作以跟踪执行之后),因此在操作内部启动另一个线程没有任何好处。 它甚至违背了HostingEnvironment.QueueBackgroundWorkItem
的全部目的,因为这些方法是异步的,但不返回任务,因此 ASP.NET 不会跟踪执行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.