2011-04-13 52 views
0

Can Action可以安全地用於本質上以這種方式觸發並忘記返回類型爲void的方法嗎?動作<T>火和遺忘?

public static void BeginAction(Foo input, Action<Foo> action) 
    { 
     action.BeginInvoke(input, EndAction, action); 
    } 

    public static void EndAction(IAsyncResult result) 
    { 
     (result.AsyncState as Action).EndInvoke(result); 
    } 

回答

2

只要你確保你打電話EndInvoke(),那麼是的。如果你忘記調用EndInvoke()並且Action有返回值或拋出異常,那麼它可能導致資源不能被釋放(.NET不會拋棄結果或異常,它將保留它們直到EndInvoke()調用聲明他們)。

+0

Id將使用它將記錄異步複製到數據庫中,'Foo'將是要複製的對象列表。永遠不會有返回值,但我會記錄任何異常。不知道是否建議.. – 2011-04-13 22:39:59

+0

構建代碼以保證調用EndInvoke()是一種最佳實踐。如果委託後面的方法拋出異常,那麼調用EndInvoke()將重新拋出同一異常實例。但是,如果異步方法有它自己的異常處理並保證(a)該方法返回void並且(b)該方法永遠不會產生異常,那麼你就是安全的 – STW 2011-04-13 22:48:26

0

您遇到的一個問題是應用程序關閉。當用戶想要關閉你的應用程序時,你如何(a)等待所有這些「即丟即用」操作完成,或者(b)優雅地終止它們?

如果您需要擔心這些事情,那麼「即忘即忘」可能無法正常工作。