我设计了一个包装.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
仍然需要初始化。
答案 0 :(得分:1)
Socket
个扩展方法,可以将过时的APM模式调整为TAP模式,以便您可以使用等待。那时练习就变得微不足道了。您的代码应如下所示:
async Task RunServer() {
Socket serverSocket = ...;
while (true) {
RunConnection(await serverSocket.AcceptAsync());
}
}
然后提供异步的Task RunConnectionAsync(Socket s)
函数。一旦你单独留下过时的APM模式,真的很简单。
或者,只使用线程和同步IO。这样做没有错。 await
更好一点,因为它会自动为您调整UI线程。