WCF 防止并发后台任务

WCF prevent concurrent background tasks

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

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

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

  3. 后台方法一启动,Web 方法就会 returns 一条 "successfully triggered" 消息并终止。

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

我也不确定 Task.Factory.StartNew 是否是最好的方法,如有任何建议,我们将不胜感激。

您可以使用 TaskFactory.StartNew,如果您使用 TaskScheduler...

的正确类型创建 TaskFactory

我建议抓住 Parallel Extensions Extras nuget package and using the 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));
}

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

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

InstanceContextMode = InstanceContextMode.Single

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

并发模式 = ConcurrencyMode.Single

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