HostingEnviornment.QueueBackgroundWorkItem无法在azure worker角色中工作

时间:2017-02-01 07:19:22

标签: c# azure azure-worker-roles azure-cloud-services

我正在尝试使用 HostingEnviornment.QueueBackgroundWorkItem 对azure worker角色进行背景上的某些任务执行,但是我在代码中遇到异常“由于当前的状态,操作无效对象。“

我们可以在azure worker角色上使用 HostingEnviornment.QueueBackgroundWorkItem 吗?如果没有,那么请帮助我在工作者角色的后台使用什么来处理任务。

1 个答案:

答案 0 :(得分:4)

根据System.Web.Hosting.HostingEnvironmentQueueBackgroundWorkItem

  

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

根据我的理解,HostingEnvironment.QueueBackgroundWorkItem为您提供了从ASP.Net Web应用程序中排队后台任务的能力。 ASP.NET会跟踪这些任务,并阻止IIS突然终止工作进程,直到所有后台任务都完成为止。

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

我认为您可以按照以下方式使用Task-based Asynchronous Programming来运行后台作业:

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

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

此外,您可以利用Hangfire在DotNet中执行后台处理。以下是一些参考资料,您可以参考它们(tutorialtutorial)。