2016-08-04 76 views
1

我想建立一個WCF服務, -單實例WCF服務(可以限制)

  1. 是單實例
  2. 允許客戶端進行多次請求功能(例如StartJob )
  3. StarJob(請求)「隊列」的請求TaskFactory(一個實例)的併發任務計劃運行(如任務工廠任務是實現爲每個example

  4. COM pleted,儘管任務運行和更多的要求都在響應返回

  5. ,它們會排隊(提供最大併發數達到)

目的是建立一個接受來自客戶端的請求的系統和將它們排隊等待處理。

當前,我的代碼(如下所示)在不考慮任務調度程序的最大併發數的情況下同時運行所有請求。

問題

  1. 我缺少什麼呢?
  2. 任何很好的例子/參考我可以看看? (我敢肯定這是不是一種罕見的用例)

代碼

IService

[ServiceContract] 
public interface ISupportService 
{ 
    [OperationContract] 
    Task<TaskResponse> StartTask(TaskRequest taskRequest); 
} 

服務

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Multiple)] 
public class SupportService : ISupportService 
{ 
    private static TaskRequestHandler taskRequestHandler; 

    public SupportService() 
    {   
     taskRequestHandler = TaskRequestHandler.GetInstance();   
    } 

    public Task<TaskResponse> StartTask(TaskRequest taskRequest) 
    { 
     var tcs = new TaskCompletionSource<TaskResponse>(); 

     if (!IsTaskRequestValid(taskRequest)) 
      tcs.SetResult(new TaskResponse()}); 

     taskRequestHandler.StartTaskAsync(taskRequest, lockHandler).ContinueWith(task => { tcs.SetResult(task.Result); }); 

     return tcs.Task; 
    }  
} 

TaskRequestHandler

public class TaskRequestHandler 
{ 
    private ConcurrentTaskScheduler taskScheduler; 
    private TaskFactory taskFactory; 

    private TaskRequestHandler() 
    { 
     taskScheduler = new ConcurrentTaskScheduler(2); 
     taskFactory = new TaskFactory(taskScheduler); 
    } 

    private Task<TaskResponse> StartTaskAsync (TaskRequest request, LockHandler lockHandler) 
    { 
     var tcs = new TaskCompletionSource<TaskResponse>(); 
     taskFactory.StartNew(() => 
     { 
      //Some task with tcs.SetResults() 
     }); 

     return tcs.Task; 
    } 
} 
+0

這個問題可以幫助你對排隊和同意:http://stackoverflow.com/questions/7122608/ WCF-concurrencymode單和instancecontextmode-percall/7149683#7149683 –

回答

0

Aaaah!我的一個大錯過。在taskFactory中執行的操作在我預料之前完成。因此,所有任務似乎並行運行。

我更新了操作代碼以正確監視操作完成並提高了正確的回調,上面的代碼工作正常。

然而,做了一個小的變化 -

  • 沒有需要​​返回一個Task。相反,剛剛返回TaskResponse就足夠了(如WCF採取的每一個OperationContract的異步和同步功能保健)