2016-03-02 87 views
0

第三方正在調用我們的WCF服務。來電者希望確認,發送的記錄已在短時間內收到並存儲。從WCF服務調用方法異步並立即返回

存儲的記錄需要一些長處理。處理可以在存儲記錄後立即執行,因此可以立即發送確認?

當然可以有一個單獨的進程來處理,但問題是我是否可以在不超時的情況下合併存儲和處理。

更新:
它看起來像這樣工作的:

var aTask = new Task(myService.TheMethod); 
aTask.Start(); 

return aVariableAsync; 

或者這是一個非常糟糕的想法從我的WCF主機內的事,因爲..?

回答

0

on MSDN所述,您可以在OperationContract屬性上將「AsyncPattern」設置爲true。

然後,您可以使用該服務方法如下屬性控制併發:

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)]

+0

我不需要調用服務異步,我想從服務內的異步調用。來電者是第三方,具有'石刻'同步服務呼叫。 –

0

是的,它可以做到的。我沒有很多的經驗,但這是一些代碼顯示的代碼片段。該服務在控制器上調用此方法,該方法將xml消息保存到硬盤驅動器,然後啓動一個單獨的任務將其處理到MongoDB中,並將消息返回給已成功保存的服務。

public string SaveTransaction(XElement pTransactionXml, string pSavePath) 
    { 

     //save the transaction to the drive locally 
     pTransactionXml.Save(pSavePath); 

     ... 

     var mongoTask = Task.Run(async() => 
     { 
      await SendXMLFilesToMongo(pSavePath); 
     }); 

     return response.WithResult("Successfully saved to disk."); 
    } 



    public virtual async Task<int> SendXMLFilesToMongo(string pSavePath) 
    { 
     //call the code to save to mongo and do additional processing 
    } 
+0

但我希望服務立即返回,而不是等待任務完成。因此,傾心「成功保存到磁盤」。不可能。答案可能就像「我們成功保存了您的請求,並且我們*承諾*它將被處理」。 –

+0

這部分說要開始一個新的任務,並運行它異步 'var mongoTask = Task.Run(async()=>' – grambo25