我在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();
}
}
}
你必须在你的页面中引用几个脚本:
- jquery-2.1.1.js
- 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作业在线程池中运行,您无法从调度程序中引用它们。你可以让作业在某个地方写下进度,然后让你的计时器检查那个地方的进度。