2009-12-23 61 views
0

任何人都可以告訴我,如果我可能會遇到意外的行爲,如果我使用匿名方法與異步I/O?匿名方法和異步I/O

作爲一個例子:

Action<Socket> acceptedHandler = DoAccept 
SocketAsyncEventArgs e = new SocketAsyncEventArgs(); 

e.Completed += ((sender, ea) => acceptedHandler(ea.AcceptSocket)); 

// Server is a Socket 
if (!Server.AcceptAsync(e)) 
    acceptedHandler(e); 

這同樣適用於的BeginXXX/EndXXX異步I/O。

回答

1

從你粘貼的代碼片段看起來似乎沒有任何問題。唯一需要擔心匿名方法的方法是捕獲變量。

+0

是不是捕獲acceptedHandler委託? – 2009-12-23 04:59:11

+0

確實......我在考慮更多關於何時引用具有可變對象(如列表等)的變量。如果您稍後更改acceptedHandler的值並且解除了偶數,那麼您將在此處調用它指向的任何內容,而不是原始的DoAccept。 – jvilalta 2009-12-23 16:05:37

+0

好的,在這個例子中,不是SocketAsyncEventArgs可變嗎?特別是因爲它可以重複使用,並且可以有多個Accepts pending? – 2009-12-23 20:22:06

1

使用匿名方法時沒有什麼可擔心的。你的例子實際上是什麼時候使用它們的一個很好的例子。殷切記得要正確使用SocketAsyncEventArgs類。我希望你的榜樣是非常人造的。

+0

你是什麼意思「體面地記得正確使用Socket AsyncEventArgs類」?這不是人爲的,但它被簡化了。 – 2009-12-23 04:55:15

+0

您確實需要將SocketAsyncEventArgs聲明爲外部類的成員,以便您可以正確處置它。 – ChaosPandion 2009-12-23 05:02:21

+0

我重用了SocketAsyncEventArgs,所以我不想處置它。 – 2009-12-23 05:12:35