Обратные вызовы являются независимыми, поскольку они вызываются в рабочих пусках ввода-вывода потоков.
Если вам интересно, вы можете видеть это в source code. Данный метод предназначен для Socket
класса (который TcpClient
и UdpClient
использование внутренне), где перекрывающихся IO используется для вызова функции обратного вызова (см комментарий на вершине asyncResult.SetUnmanagedStructures
вызова:
private void DoBeginReceiveFrom(byte[] buffer, int offset,
int size, SocketFlags socketFlags,
EndPoint endPointSnapshot, SocketAddress
socketAddress, OverlappedAsyncResult asyncResult)
{
EndPoint oldEndPoint = m_RightEndPoint;
SocketError errorCode = SocketError.SocketError;
try
{
// Set up asyncResult for overlapped WSARecvFrom.
// This call will use completion ports on WinNT and Overlapped IO on Win9x.
asyncResult.SetUnmanagedStructures(
buffer, offset, size,
socketAddress, true /* pin remoteEP*/,
ref Caches.ReceiveOverlappedCache);
asyncResult.SocketAddressOriginal = endPointSnapshot.Serialize();
if (m_RightEndPoint == null)
{
m_RightEndPoint = endPointSnapshot;
}
int bytesTransferred;
errorCode = UnsafeNclNativeMethods.OSSOCK.WSARecvFrom(
m_Handle,
ref asyncResult.m_SingleBuffer,
1,
out bytesTransferred,
ref socketFlags,
asyncResult.GetSocketAddressPtr(),
asyncResult.GetSocketAddressSizePtr(),
asyncResult.OverlappedHandle,
IntPtr.Zero);
if (errorCode!=SocketError.Success)
{
errorCode = (SocketError)Marshal.GetLastWin32Error();
}
}
catch (ObjectDisposedException)
{
m_RightEndPoint = oldEndPoint;
throw;
}
finally
{
errorCode = asyncResult.CheckAsyncCallOverlappedResult(errorCode);
}
}
Какой класс вы используете для 'BeginReceive 'on? –
@Yuval - Класс, используемый для вызовов Async и Sync, - Socket. – Robert