2015-01-27 52 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