WCF阻止并发后台任务

时间:2015-01-27 01:38:08

标签: c# multithreading wcf concurrency

我正在开发一个像这样设置的WCF Web服务:

  1. 来自任务计划程序的REST请求定期触发的Web方法(每15分钟一次)。

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

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

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

    我不确定Task.Factory.StartNew是否也是最好的方法,对任何建议都会感激不尽。

2 个答案:

答案 0 :(得分:1)

如果使用正确类型的TaskFactory.StartNew创建TaskFactory,则可以使用TaskScheduler

我建议抓住Parallel Extensions Extras 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));
}

因此,您可以看到,它按照添加顺序在单个线程中运行操作。

答案 1 :(得分: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