如何异步等待连接?

时间:2015-04-25 09:43:31

标签: c# sockets asynchronous

我设计了一个包装.align-end { justify-content: flex-end; } 的类,允许通过它发送和接收。由于接受,发送和接收是通过UI完成的,我不希望它们阻止它,因此我使用了它们的异步版本。

以下是相关代码:

Socket

当我开始接收时,由于还没有连接,它必须等待一(1)并阻止UI(这也是我不想要的)。
此外,当接受连接时,我会收到public void Accept() { // ... // where resultAccept is a IAsyncResult resultAccept = listener.BeginAccept(new AsyncCallback(AcceptCallback), null); } private void AcceptCallback(IAsyncResult ar) { connectedSocket = listener.EndAccept(ar); } public string Receive() { char[] data = new char[128]; if (!resultAccept.IsCompleted) // (1) resultAccept.AsyncWaitHandle.WaitOne(); connectedSocket.BeginReceive(Encoding.UTF8.GetBytes(data), 0, data.Length, SocketFlags.None, new AsyncCallback(RecvCallback), null); // ... } ,因为NullReferenceException启动时BeginReceive是,是,已触发,但尚未完成,因此AcceptCallback仍然需要初始化。

  1. 为什么我的方法有误?
  2. 是否可以通过异步套接字实现我想要的效果?
  3. 如何在等待连接时阻止用户界面阻止并确保对象的有效性?

1 个答案:

答案 0 :(得分:1)

  1. 是的,因为你阻止了。你需要扔掉它。
  2. 是的,网络上有Socket个扩展方法,可以将过时的APM模式调整为TAP模式,以便您可以使用等待。那时练习就变得微不足道了。
  3. 您的代码应如下所示:

    async Task RunServer() {
     Socket serverSocket = ...;
    
     while (true) {
      RunConnection(await serverSocket.AcceptAsync());
     }
    }
    

    然后提供异步的Task RunConnectionAsync(Socket s)函数。一旦你单独留下过时的APM模式,真的很简单。

    或者,只使用线程和同步IO。这样做没有错。 await更好一点,因为它会自动为您调整UI线程。