我有两个按计划的作业运行的Sitecore代理。代理程序A是一项长期运行的任务,具有较低的优先级。代理B是具有高优先级的短期任务。B以比A的间隔短的间隔运行。
问题是当A已经运行时B永远不会运行。
我已经实现了此功能,以便能够在内容编辑器中手动运行代理。当我这样做时,尽管A已经在运行,我仍然可以运行B(即使我在自定义对话框中将它们设置为相同的线程优先级)。
如何在配置文件中指定B的优先级高于A?还是使我的计划作业设置为多线程,以便可以在Sitecore中同时运行作业?有没有标准的方法可以做到这一点?
我尝试过类似的操作,在代理实现中设置线程优先级,但是当A已经运行时,永远不会在B中调用此代码。因此,应该以某种方式在工作实施之前“确定优先级”。
我意识到,将我的高优先级计划任务B作为Sitecore的后台代理运行不是一个好的解决方案,因此我得到了以下解决方案。出于这个答案的目的,我现在将其称为B:ExampleJob
我创建了一个名为的新代理类ExampleJobStarter
。这项工作的目的仅仅是启动另一个运行实际工作的线程ExampleJob
:
public class ExampleJobStarter
{
public override void Run()
{
if (ExampleJob.RunTheExampleJob) return;
ExampleJob.RunTheExampleJob = true;
Task.Run(() => new ExampleJob().Run());
}
}
public class ExampleJob
{
public static bool RunTheExampleJob;
public override void Run()
{
while (RunTheExampleJob)
{
DoWork();
Thread.Sleep(10000);
}
}
private void DoWork()
{
... // here I perform the actual work
}
}
ExampleJobStarter
现在已在我的Sitecore配置文件中注册,可以每10分钟运行一次。我还ExampleJob
从Sitecore配置中删除了它,因此它不会自动运行(因此,它本身不再是Sitecore作业)。ExampleJobStarter
只会确保ExampleJob
在另一个线程中运行。ExampleJob
本身将每隔10秒执行一次工作,而不会受到仍然作为普通后台代理运行的低优先级工作代理的干扰。
如果您走这条路,请注意死锁问题(在这种情况下,这不是我正在使用的数据的问题)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句