2013-08-28 66 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

另一種辦法是檢查是'等待()'結果。 – svick

8

不,@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 
} 
+0

當任務處於三種最終狀態之一時,「IsCompleted」將返回true:'RanToCompletion','Faulted'或'Canceled',因此@Jon是正確的... –

+0

@EAKTEAM不完全符合我所看到的,喬恩說,'IsCompleted' ='client.Connected'。連接'任務'和連接不是一回事。 –