Quartz.Net ASP.Net状态更新



我在asp.net网站中使用石英,我用它来启动更长的后台任务。我希望能够使用计时器或jquery来调用作业,并返回类似于以前的状态和进度信息。这是我使用的代码:

protected void Timer1_Tick(object sender, EventArgs e)
{    
    if (MyTaskManager.Instance.IsTaskRunning)
    {
         if (MyTaskManager.Instance.TotalItems > 0) ProgressLabel.Text =   string.Format(ProgressLabel.Text, MyTaskManager.Instance.TotalItems, MyTaskManager.Instance.ItemsProcessed);
                    else ProgressLabel.Text = string.Format("Records Processed: {0}", MyTaskManager.Instance.ItemsProcessed);
    }
    else
    {
        Timer1.Enabled = false;
    }
}

有没有人这样做可以为我指明正确的方向?

这可能不是你想要的,但我在Quartz.Net中使用了SignalR,它效果很好
我在我的存储库中发布了一个简单的应用程序。

您必须创建一个自定义集线器,用于与ASP.NET页面交互
您的(quarter.net)作业将以相同的方式通过Hub与ASP.net页面交互。

安装ASP.NET SignalR后:

Install-Package Microsoft.AspNet.SignalR

您可以创建一个启动类来配置SignalR:

[assembly: OwinStartup(typeof(AspNetQuartSignalR.Startup))]
namespace AspNetQuartSignalR
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.MapSignalR();
        }
    }
}

你必须在你的页面中引用几个脚本:

  1. jquery-2.1.1.js
  2. jquery.signalR-2.1.1.js

以及自动生成的/信号机/集线器

现在您可以创建自己的Hub:

public class QuartzHub : Hub
{
   ...
}

方法,这些方法将允许您与ASP.NET页面中的脚本进行交互。

假设您的Hub有一个方法CheckQuartzStatus,它为您提供配置的所有quartz.net触发器的状态:

public void CheckQuartzStatus()
{
    string message = string.Empty;
    var allTriggerKeys = Global.Scheduler.GetTriggerKeys(GroupMatcher<TriggerKey>.AnyGroup());
    foreach (var triggerKey in allTriggerKeys)
    {
    ITrigger trigger = Global.Scheduler.GetTrigger(triggerKey);
    message += string.Format("{0} = {1}", trigger.Key, Global.Scheduler.GetTriggerState(trigger.Key)) + Environment.NewLine;
    }
    Clients.All.onCheckQuartzStatus(message);
}

您的jQuery脚本可以用一种非常简单的方式与此方法交互:

quartz.server.checkQuartzStatus();

正如您所看到的,您的Hub方法在某个时刻触发了一个操作:onCheckQuartzStatus
这是对页面中定义的javascript中定义的事件的调用:

quartz.client.onCheckQuartzStatus = function (message) {
    alert(message);
};

您可以通过查看Default.aspx页面中的脚本来查看交互的工作方式。

你可以在这里阅读更多。

您必须自己构建所有这些功能。Quartz.Net作业在线程池中运行,您无法从调度程序中引用它们。你可以让作业在某个地方写下进度,然后让你的计时器检查那个地方的进度。

最新更新