【问题标题】:HostingEnviornment.QueueBackgroundWorkItem is not working in azure worker roleHostingEnviornment.QueueBackgroundWorkItem 不能在 azure worker 角色中工作
【发布时间】:2017-02-02 15:29:35
【问题描述】:

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

我们可以在 azure worker 角色上使用 HostingEnviornment.QueueBackgroundWorkItem 如果不能,那么请帮助我在后台处理任务中的 worker 角色可以使用什么。

【问题讨论】:

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


    【解决方案1】:

    根据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)。

    【讨论】:

    • 感谢您的回答。从您的回答中,我了解到HostingEnvironment.QueueBackgroundWorkItem 如果在 ASP.Net 环境以外的任何环境中运行,它将无法工作。因此,使用 XUnit/NCrunch 的单元测试在使用 QueueBackgroundWorkItem 的代码上也总是会失败。对吗?
    猜你喜欢
    • 2016-07-16
    • 2018-03-03
    • 1970-01-01
    • 2013-04-08
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 2015-05-27
    • 1970-01-01
    相关资源
    最近更新 更多