首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TcpClient ConnectAsync获取状态

TcpClient ConnectAsync获取状态
EN

Stack Overflow用户
提问于 2013-08-28 19:27:56
回答 2查看 11.1K关注 0票数 3

有没有什么方法可以获取TcpClient异步连接的状态?使用以下代码,我如何使用Connected属性获取客户端的状态?我尝试异步建立远程连接,但同时等待的时间不超过5秒……

代码语言:javascript
复制
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)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-28 20:11:35

首先,不要创建自己的新Task;这是一个错误。ConnectAsync已返回表示连接尝试的Task

代码语言:javascript
复制
var tsk = client.ConnectAsync(host, port);
tsk.Wait(5000);

等待返回后,检查任务的IsCompleted属性;当且仅当建立了连接时,它才为true

票数 9
EN

Stack Overflow用户

发布于 2016-11-07 09:46:01

不,@Jon错了!如果任务已经完成,IsCompleted只会告诉你,它不会表明连接已经建立。例如,如果在特定地址/端口上没有打开任何服务器,IsCompleted仍将返回true ...您应该改为检查IsFaulted

这是我从互联网上拼凑而成的代码,我已经对进行了测试

代码语言:javascript
复制
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
}
票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18486585

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档