2013-08-28 5 views
1

Есть ли способ получить статус асинхронного соединения TcpClient? Используя следующий код, как я могу получить статус клиента, используя свойство Connected? Я пытаюсь установить удаленное подключение асинхронно, но в то же время не ждите более 5 секунд ...TcpClient ConnectAsync получить статус

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) 

ответ

7

Во-первых, не создавайте новую Task свой собственный; это ошибка. ConnectAsync уже возвращает Task, который представляет попытку подключения:

var tsk = client.ConnectAsync(host, port); 
tsk.Wait(5000); 

После возвращения ожидания, проверьте IsCompleted свойства задачи; он будет true тогда и только тогда, когда соединение установлено.

+1

Другим вариантом будет проверка является результатом 'Wait()'. – svick

8

Нет, @ Джон ошибается! 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 
} 
+0

'IsCompleted' вернет true, когда задача находится в одном из трех конечных состояний:' RanToCompletion', 'Faulted' или' Canceled', поэтому @Jon прав ... –

+0

@EAKTEAM не совсем, из того, что я вижу, Джон заявил, что 'IsCompleted' =' client.Connected'. Соединение «Задача» и соединение - это не одно и то же. –

Смежные вопросы