MSDN文件说:
取消挂起的调用BeginConnect方法,关闭套接字。 当异步操作处于 进度中时调用Close方法时,将调用提供给BeginConnect方法的回调。 对EndConnect方法的后续调用将抛出 ObjectDisposedException来指示操作已取消 。
所以,你必须每次创建一个新的Socket:
public Socket TryConnect(...)
{
Socket socket;
try
{
socket = new Socket(...);
var connect = Task.Factory.FromAsync(
socket.BeginConnect, socket.EndConnect, host, port, null);
var isConnected = connect.Wait(TimeSpan.FromSeconds(0.5));
if (!isConnected)
{
socket.Close();
return null;
}
return socket;
}
catch
{
if (socket != null)
{
socket.Dispose();
}
throw;
}
}
for (var i = 0; i < 10; i++)
{
var socket = TryConnect();
if (socket != null)
return socket;
}