Rückrufe sind unabhängig, da sie in den IO-Abschlussarbeitern der Thread-Pools aufgerufen werden. Wenn Sie interessiert sind, können Sie das in source code sehen. Diese Methode ist für die Socket
Klasse (die TcpClient
und UdpClient
Verwendung intern), in dem überlappten IO verwendet wird, um den Rückruf aufrufen (Kommentar oben auf asyncResult.SetUnmanagedStructures
Aufruf sehen:
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);
}
}
Welche Klasse verwenden Sie 'BeginReceive 'on? –
@Yuval - Die Klasse, die für Async- und Sync-Aufrufe verwendet wird, ist Socket. – Robert