捕获 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。将 await
与 Socket
一起使用,问题就会以更好的代码质量消失。
或者,使用同步IO。如果一次只有几十个连接,这是合适的。这导致代码更简单。
或者,创建 IP 和端口实例变量。不需要全局变量。
正如您在下面的代码中看到的,我正在调用连接 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。将 await
与 Socket
一起使用,问题就会以更好的代码质量消失。
或者,使用同步IO。如果一次只有几十个连接,这是合适的。这导致代码更简单。
或者,创建 IP 和端口实例变量。不需要全局变量。