我正在开发一个像这样设置的WCF Web服务:
来自任务计划程序的REST请求定期触发的Web方法(每15分钟一次)。
触发后,Web方法使用Task.Factory.StartNew启动后台方法。此方法涉及从远程API获取和发布以及写入本地数据库,有时需要几分钟才能完成。
一旦后台方法启动,web方法就会返回“成功触发”消息并终止。
我的问题是:如果在仍在运行时再次触发Web方法,后台方法是否能够在多个线程上并发运行?我不希望这种情况发生,因为它可能会导致各种麻烦。理想情况下,我希望多个调用排队,并在一个后台线程上逐个执行。
我不确定Task.Factory.StartNew是否也是最好的方法,对任何建议都会感激不尽。
答案 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
ConcurrencyMode = ConcurrencyMode.Single