2015-01-27 53 views
0

我开发是建立这样一个WCF Web服务:从任务调度REST请求被周期性地触发WCF防止并发后台任务

  1. Web方法(每15分钟)。

  2. 当触发时,web方法使用Task.Factory.StartNew启动后台方法。此方法涉及从远程API获取和发布并写入本地数据库,有时需要几分钟才能完成。

  3. 只要后台方法启动,web方法就会返回“成功触发”消息并终止。

我的问题是这样的:如果Web方法仍然在运行时再次触发,背景方法是否能够在多个线程上同时运行?我不希望发生这种情况,因为它可能会导致各种麻烦。理想情况下,我想要多个调用排队并在单个后台线程上逐个执行。

我不确定如果Task.Factory.StartNew是最好的方法来做到这一点,将不胜感激的任何建议。

回答

1

您可以使用TaskFactory.StartNew,如果创建正确的那种TaskScheduler一个TaskFactory ...

我建议抓住并行扩展额外nuget package和使用OrderedTaskScheduler来运行你的任务:

System.Threading.Tasks.Schedulers.OrderedTaskScheduler sch = new OrderedTaskScheduler(); 

//you could persist this as static or in the kernel of your favorite DI framework  
var taskFactory = new TaskFactory(sch); 

for(var i = 0; i < 10; ++i) 
{ 
    var x = i; 
    //these Console operations will occur in order 
    taskFactory.StartNew(() => Console.WriteLine(x)); 
    //but if we did as below, order would be lost 
    //Task.Factory.StartNew(() => Console.WriteLine(x)); 
} 

所以,你可以看到,它按照它们被添加的顺序在单个线程中运行这些动作。

+0

这正是我想要的,伟大工程!非常感谢。 – sano 2015-01-28 00:43:33

0

如果您想限制WCF服务本身一次限制执行单​​个线程(即对服务的并发调用将一次阻塞并执行一个),请考虑使用ServiceBehaviorAttribute的以下属性,您可以附加到您的服务实施。

InstanceContextMode = InstanceContextMode.Single

https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.instancecontextmode(v=vs.110).aspx

ConcurrencyMode = ConcurrencyMode.Single

https://msdn.microsoft.com/en-us/library/system.servicemodel.servicebehaviorattribute.concurrencymode(v=vs.110).aspx