捕获 AsyncCallback

Catch an AsyncCallback

正如您在下面的代码中看到的,我正在调用连接 IP 和端口。 如果服务器不是 运行,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 和端口实例变量。不需要全局变量。