我正在尝试使用 HostingEnviornment.QueueBackgroundWorkItem 对azure worker角色进行背景上的某些任务执行,但是我在代码中遇到异常“由于当前的状态,操作无效对象。“。
我们可以在azure worker角色上使用 HostingEnviornment.QueueBackgroundWorkItem 吗?如果没有,那么请帮助我在工作者角色的后台使用什么来处理任务。
答案 0 :(得分:4)
根据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突然终止工作进程,直到所有后台任务都完成为止。
此外,我尝试在我的工作者角色和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中执行后台处理。以下是一些参考资料,您可以参考它们(tutorial和tutorial)。