2013-04-22 86 views
3

我們有一個下游系統,一個ERP系統,可以通過SOAP公開其表格。它發佈的Web服務通常具有創建,更新和刪除方法。然後,我們使用svcutil生成代理,包括異步方法。最後,我們在此之前放置一個ACL,以便其他系統與之交互。更好地拋出NotSupportedException任務內部或外部?

我們也剛剛發現一個重要的不變量 - 項目的成本計算信息不能由除ERP系統本身以外的任何其他項目更新。然而,真正愚蠢的API將允許消費者這樣做。

我想解決這個問題是繼承WCF代理,並有更新的顯式實現拋出NotSupportedException。不,這不會阻止開發人員創建自己的代理並執行此操作。但至少我們可以保證在通過ACL時不會發生這種情況。

Update_Result Item_Port.Update(Update request) 
    { 
     throw new NotSupportedException(); 
    } 

對於異步方法,我可以做任何

Task<Update_Result> Item_Port.UpdateAsync(Update request) 
    { 
     throw new NotSupportedException(); 
    } 

OR

Task<Update_Result> Item_Port.UpdateAsync(Update request) 
    { 
     return Task.Factory.StartNew<Update_Result>(() => 
     { 
      throw new NotSupportedException(); 
     }); 
    } 

從一個異步的角度看,哪一個更 '正確的嗎?'

+2

順便說一句,不是使用具有拋出lambda的'StartNew()',而是使用'TaskCompletionSource'和'SetException()'。 – svick 2013-04-23 00:21:15

+0

這個問題是關於.NET 4.0沒有任何異步擴展,它會更好地刪除/避免使用C#-5.0術語'異步'在制定問題,因爲它混淆 – 2013-04-23 02:38:19

+0

我一直忘記.net 4.5是c# 5.0。 – 2013-04-23 16:18:26

回答

4

兩者會有不同的行爲。

在第一種情況下,調用此方法後,此API的調用者將立即獲得NotSupportedException

在第二種情況下,主叫方將收到一個故障Task<T>(或在呼叫完成後即將發生故障)。這將導致任務延續或任務值被提取時發生異常(通過task.Result)。

給出你的目標,我會親自去第一種方法。這種方法的開銷較小(你沒有創建任務),並且它使得調用網站立即明顯表示出現了問題。雖然它不如編譯時錯誤,但在調試過程中錯過的可能性要小得多,因爲即使任務是以「隨意而忘記」的方式調用,也會丟失。

+0

爲了支持這個觀點,我會告訴任何延遲的,被援引的,附屬的和/或間接的「好意」(或時間誘殺陷阱)都是非常刺激和混亂的。請注意,在第二種情況下,在任務繼續或獲取結果之前可能會發生大量的操作。有可能它甚至不會繼續或取得結果! – 2013-04-23 03:05:57

+0

好的,這對我來說已經足夠了! – 2013-04-23 16:17:34

相關問題