ArgumentException: IAsyncResult object was not returned from the corresponding...

T

Tester

Hello,

Could someone tell me under what conditions the following exception occurs
with async sockets:

"System.ArgumentException: The IAsyncResult object was not returned from the
corresponding synchronous method on this class."

This is being thrown from within the callback that is specified to
Socket.BeginReceive (happens rarely, but still does happen)

I see only 1 reference to this exception on the whole web, which is not
answered either.

The steps are very simple,

start()
{
Socket.BeginReceive(ReadCallback)
}
ReadCallback()
{
Socket.EndReceive
Socket.BeginReceive
}

One case that i noticed where this happens is when code is still executing
inside ReadCallback and socket gets disconnected then reconnected and
another Socket.BeginReceive is scheduled while previous ReadCallback didn't
return yet. There are some other cases where this exception occurs.

Thanks for any input on this
 
T

Tom Hall

I think I know what's going on. Since you didn't show much code, I assume
you are holding the socket object in a class-scoped variable. So, if
somehow the socket gets disconnected while the ReadCallback is executing and
you reconnect it (thereby changing the socket object) - now they don't
match, you are trying to complete the Async request using the new object
when the old one is the one actually completing. This is why all the
examples in MSDN tell you to pass your socket as the "state" parameter - not
because it must be passed that way only (although they say it as if it were
so) but because doing it their way ensures you are always attempting to call
EndReceive on the correct socket corresponding to the IAsyncResult object!
You also must get real unlucky and have a thread context switch at just the
right moment occasionally which allows the newly connected socket to
overwrite your old one - between the start of the callback and when your
callback code calls EndReceive.

Hope this helps
Tom
 
T

Tester

I think you're right. Thanks for pointing me in the right direction. I'll
try it the recommended way :)

Thanks a lot
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top