Dav*_*ury 3 c# sockets task-parallel-library
有什么办法可以获得TcpClient异步连接的状态吗?使用以下代码,如何使用Connected属性获取客户端的状态?我尝试异步建立远程连接,但同时不要等待超过5秒......
TcpClient client = new TcpClient();
Task tsk = Task.Factory.StartNew(() =>
{
   client.ConnectAsync(host, port);
   // client.Connect   (this is always false)
});
tsk.Wait(5000);
// client.Connect   (or if I use it here, this is always false)
Taa*_*aai 12
不,@Jon错了!该IsCompleted会只是告诉你,如果任务已经完成,它不会不表明连接已完成.例如,如果在特定地址/端口上没有打开服务器,IsCompleted则true无论如何都将返回...您应该检查IsFaulted.
这是代码,我从互联网的各个部分放在一起,我已经测试过:
string address = "127.0.0.1";
int port = 8888;
int connectTimeoutMilliseconds = 1000;
var tcpClient = new TcpClient();
var connectionTask = tcpClient
    .ConnectAsync(address, port).ContinueWith(task => {
        return task.IsFaulted ? null : tcpClient;
    }, TaskContinuationOptions.ExecuteSynchronously);
var timeoutTask = Task.Delay(connectTimeoutMilliseconds)
    .ContinueWith<TcpClient>(task => null, TaskContinuationOptions.ExecuteSynchronously);
var resultTask = Task.WhenAny(connectionTask, timeoutTask).Unwrap();
resultTask.Wait();
var resultTcpClient = resultTask.Result;
// Or shorter by using `await`:
// var resultTcpClient = await resultTask;
if (resultTcpClient != null)
{
    // Connected!
}
else
{
    // Not connected
}
首先,不要创建Task自己的新的; 这是一个错误.ConnectAsync已经返回一个Task表示连接尝试:
var tsk = client.ConnectAsync(host, port);
tsk.Wait(5000);
等待返回后,检查IsCompleted任务的属性; 这将是true当且仅当建立连接.
| 归档时间: | 
 | 
| 查看次数: | 7609 次 | 
| 最近记录: |