2016-02-23 52 views
0

我有一個使用基於任務的操作的WCF代理。我正在製作一個包含在Parallel.ForEach()中的方法調用。我所調用的服務方法是一個緩慢/長時間運行的操作,偶爾會返回異常。我無法在我的catch塊中捕捉到這些異常 - 從未碰到過塊。我能夠捕捉異常的唯一方法是使用同步服務方法。如何使用異步服務方法捕獲異常?處理過程中是否返回異常?WCF基於任務的操作異常處理和TPL

Parallel.ForEach(campaignResults.SelectMany(cd => cd), result => 
    { 
     try 
      { 
       retList.TryAdd(client.SubmitRequestAsync(result.id, requestDetail), item.id); 
      } 
     catch (AggregateException ex) 
      { 
       // NEVER HIT ON EXCEPTION 
       foreach (Exception e in ex.InnerExceptions) 
        { 
         Trace.TraceError(e.ToString()); 
        } 
      } 
    } 
+0

'FaultException '應該拋出,不應該?你是否試圖捕捉常見的「例外」? –

+0

@IlyaChumakov ...是的,我確實試圖捕捉異常,並不起作用。 –

回答

2

也許你不應該被抓住的AggregateException而是一種普遍的例外和移動AggregateException處理Parrallel.ForEach循環外。

MSDN: Handle Exceptions in Parallel Loops

如果您使用的是IIS託管WCF服務,只記得有一個默認的20分鐘空閒超時,除非改變。後臺任務不會被視爲非空閒請求,您可能會發現IIS會停止您的WCF服務,因爲在20分鐘空閒超時之前沒有發出進一步的請求。

+0

絕對正確的答案 –

+0

@BigDaddy你說'異常'捕獲不起作用? –

+0

@IlyaChumakov ...對,但是與ConcurrentStack和AggregateException一起,這是正確的解決方案。對不起,如果我誤解了你的問題。 –