2

尝试实现连接到服务器的超时参数,但我运气不佳。这是我的代码:

client = new TcpClient();

Task task = Task.Factory.FromAsync(client.BeginConnect, client.EndConnect, host, port, null);

bool taskCompleted = connectTask.Wait(timeoutInMS);

if (taskCompleted)
{
    // Do something with the establishment of a successful connection
}
else
{
    Console.WriteLine("Timeout!");
}

不幸的是,如果 timeoutInMS 大于 1022,则会在此行引发 AggregateException:

bool taskCompleted = connectTask.Wait(timeoutInMS);

调整 TcpClient 的超时属性似乎没有任何区别。

4

1 回答 1

3

很可能是因为Task在 1022 毫秒内还没有产生结果。但是等了一会儿,任务就能够捕捉到SocketException被扔掉的东西了TcpClient

您的情况类似于以下情况:

var task = Task.Factory.StartNew(() =>
{
  Thread.Sleep(5000);
  throw new Exception();
});

bool taskCompleted = task.Wait(4000); // No exception
bool taskCompleted = task.Wait(6000); // Exception

顺便问一下,FromAsync()当您TcpClient以同步方式使用时,您为什么要使用?

于 2011-10-12T04:37:19.813 回答