我在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;
}
}
是否有人这样做可以指出我正确的方向?
答案 0 :(得分:1)
它可能不是你想要的但是我在Quartz.Net中使用了SignalR并且效果很好。
我在repository发布了一个简单的应用程序。
您必须创建一个自定义Hub,用于与ASP.NET页面进行交互 您的( quartz.net )作业将以相同的方式通过集线器与您的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();
}
}
}
您必须在页面中引用几个脚本:
和自动生成的 / signalr / hubs
现在您可以创建自己的Hub:
public class QuartzHub : Hub
{
...
}
使用允许您与ASP.NET页面中的脚本进行交互的方法。
假设您的集线器有一个方法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页面中查看交互的工作方式。
您可以阅读更多here。
答案 1 :(得分:0)
您必须自己构建所有这些功能。 Quartz.Net作业在线程池中运行,您无法从调度程序中引用它们。你可以通过让工作在某个地方写出进度然后让你的计时器检查那个进度点来做到这一点。