HostingEnviornment.QueueBackgroundWorkItem无法以天蓝色工作人员角色运行

mah*_*rma 3 c# azure azure-worker-roles azure-cloud-services

我正在尝试在天蓝色工作角色上使用HostingEnviornment.QueueBackgroundWorkItem在后台执行某些任务,但是我在代码“由于对象的当前状态而导致操作无效”中遇到了异常 。。

我们可以在天蓝色的工作人员角色上使用HostingEnviornment.QueueBackgroundWorkItem吗?如果不能,请帮助我在工作人员角色的后台如何处理流程任务。

Bru*_*hen 6

根据System.Web.Hosting.HostingEnvironment和QueueBackgroundWorkItem:

与正常的ThreadPool工作项的不同之处在于,ASP.NET可以跟踪当前正在运行通过此API注册的工作项的数量,并且ASP.NET运行时将尝试延迟AppDomain关闭,直到这些工作项执行完毕。不能在ASP.NET管理的AppDomain之外调用此API。当应用程序关闭时,将提供所提供的CancellationToken信号。

根据我的理解,HostingEnvironment.QueueBackgroundWorkItem您可以从ASP.Net Web应用程序中排队后台任务。ASP.NET跟踪这些任务,并防止IIS在所有后台任务完成之前突然终止工作进程。

另外,我尝试HostingEnvironment.QueueBackgroundWorkItem在我的工作角色中同时调用Azure和Azure,以及一个新的控制台应用程序。在ASP.NET Web应用程序中调用此方法时,它可以按预期工作。

我假设您可以按照以下方式利用基于任务的异步编程来运行后台作业:

var tokenSource = new CancellationTokenSource();
var cancellationToken = tokenSource.Token;

Task.Factory.StartNew((token) => {
    var ct = (CancellationToken)token;
    while (!ct.IsCancellationRequested)
    {
        //do your job
    }
}, cancellationToken, cancellationToken);
Run Code Online (Sandbox Code Playgroud)

此外,您可以利用Hangfire在DotNet中执行后台处理。这里有一些参考,您可以参考它们(tutorial和tutorial)。

  • 感谢您的回答。从您的回答中我了解到,如果HostingEnvironment.QueueBackgroundWorkItem在非ASP.Net环境中运行,则将无法正常工作。因此,使用XUnit / NCrunch进行单元测试也总是会在使用QueueBackgroundWorkItem的代码上失败。那是对的吗? (3认同)