WCF 防止并发后台任务
WCF prevent concurrent background tasks
我正在开发这样设置的 WCF Web 服务:
由来自任务计划程序的 REST 请求定期触发(每 15 分钟)的 Web 方法。
触发后,web 方法使用 Task.Factory.StartNew 启动后台方法。此方法涉及从远程 API 获取和发送以及写入本地数据库,有时需要几分钟才能完成。
后台方法一启动,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
并发模式 = ConcurrencyMode.Single
我正在开发这样设置的 WCF Web 服务:
由来自任务计划程序的 REST 请求定期触发(每 15 分钟)的 Web 方法。
触发后,web 方法使用 Task.Factory.StartNew 启动后台方法。此方法涉及从远程 API 获取和发送以及写入本地数据库,有时需要几分钟才能完成。
后台方法一启动,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
并发模式 = ConcurrencyMode.Single