捕获异步回调

本文关键字:回调 异步 | 更新日期: 2023-09-27 18:00:20

正如您在下面的代码中看到的,我使用IP和端口调用connect。如果服务器未运行,s.EndConnect(ar)将引发ObjectDisposedException。现在,如果发生这种情况,我想等待5秒钟,然后重试。问题是在ConnectCallback中捕获它,并且由于对象IAsyncResult ar已被释放,因此调用它本身不起作用?我不会全局存储IP和端口。

现在很明显,我可以在全球范围内存储它们,并以这种方式进行修复,但我想知道是否还有其他方法可以解决这个问题。因为我不需要IP和端口,所以在其他地方全局存储它们似乎是不必要的。

Socket s;
public ClientSettings()
{
    s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
}
public void Connect(string IP, int port)
{
    /* Simple connection method */
    try
    {
        IPEndPoint ep = new IPEndPoint(IPAddress.Parse(IP), port);
        s.BeginConnect(ep, new AsyncCallback(ConnectCallback), s);
    }
    catch { }
}
void ConnectCallback(IAsyncResult ar)
{
    s.EndConnect(ar);
    connected = true;
    byte[] buffer = new byte[8192];
    s.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(ReadCallback), buffer);
}

捕获异步回调

您使用的是过时的API。将awaitSocket结合使用,问题会以更好的代码质量解决。

或者,使用同步IO。如果一次只有几十个连接,这是合适的。这使得代码更加简单。

或者,制作IP和端口实例变量。不需要全局变量。