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;
}