繁体   English   中英

在 QueueBackgroundWorkItem 中使用任务

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM