2009-12-23 2 views
0

Может ли кто-нибудь сказать мне, может ли я столкнуться с непреднамеренным поведением, если я использую анонимные методы с Async I/O?Анонимные методы и Async 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

Разве это не захват принятого делегата Хэндлера? –

+0

Действительно ... Я думал больше о том, когда вы ссылаетесь на переменные, которые имеют изменяемые объекты, такие как списки и т. Д. Если позже вы измените значение принятогоHandler, а четное будет уволено, вы вызовете то, на что оно ссылается в этот момент, а не оригинальный DoAccept. – jvilalta

+0

Хорошо, так в этом примере не изменен SocketAsyncEventArgs? Тем более, что его можно повторно использовать, и вы можете иметь несколько ожидающих решений Accepts? –

1

Остерегайтесь использования анонимных методов. Ваш пример на самом деле является хорошим примером того, когда их использовать. Неприемливо помните, чтобы правильно использовать класс SocketAsyncEventArgs. Я надеюсь, что ваш пример чрезвычайно надуман.

+0

Что значит «прилично помнить, правильно ли использовать класс Socket AsyncEventArgs»? Это не надуманно, но это упрощено. –

+0

Вам действительно нужно объявить SocketAsyncEventArgs как член внешнего класса, чтобы вы могли его правильно распорядиться. – ChaosPandion

+0

Я повторно использую SocketAsyncEventArgs, поэтому я не хочу избавляться от него. –

Смежные вопросы