捕获异步回调
本文关键字:回调 异步 | 更新日期: 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。将await
与Socket
结合使用,问题会以更好的代码质量解决。
或者,使用同步IO。如果一次只有几十个连接,这是合适的。这使得代码更加简单。
或者,制作IP和端口实例变量。不需要全局变量。