c# - 从异步回调调用同步方法调用?

标签 c# asynchronous synchronous

在异步回调中调用同步方法时会发生什么?

示例:

private void AcceptCallback(IAsyncResult AR)
{
    tcp.BeginReceive(ReceiveCallback);
}

private void ReceiveCallback(IAsyncResult AR)
{
    tcp.Send(data);
}

接受连接并启动异步接收回调。当 tcp 连接接收到数据时,它会调用 receive 回调。

如果调用同步 Send 方法,是否会阻止其他异步回调的发生?
还是所有异步回调都相互独立?

最佳答案

回调是独立的,因为它们是在线程池 IO 完成工作器上调用的。

如果您有兴趣,可以在 source code 中查看.此特定方法用于 Socket 类(TcpClientUdpClient 在内部使用),其中重叠 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);
    }
}

关于c# - 从异步回调调用同步方法调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30979857/

相关文章:

c# - 将 CollectionBase 转换为 List 或可与 Linq 一起使用的数据类型

android - 如何在特定时间从 Activity 运行 AsyncTask?

Javascript Promise、then 和 catch 方法的返回 Promise

javascript - 按顺序处理文件内容

javascript - 如何在 NodeJS 中控制应用程序的流程

c# - 首次使用该应用程序时,如何使用 C#.Net 创建新文件夹?

c# - 使用 Control.BeginInvoke() 调用异步方法时如何防止警告 VSTHRD101?

javascript - 异步汤调用

json - 无需 future/async 同步解析本地 json 文件

c# - 数据库初始化后无法禁用迁移