[英]C# await TcpClient ConnectAsync/ReadToEndAsync with timeout
[英]C# TcpClient Timeout
我試圖連接到本地網絡內的路由器。 到目前為止,我已經使用了TcpClient。
檢查我的代碼:
public static void RouterConnect()
{
TcpClient tcpClient = new TcpClient("192.168.180.1",23); <-- Timeout comes up here
tcpClient.ReceiveTimeout = 2000; // Not working
tcpClient.SendTimeout = 2000; // Also not working
NetworkStream nStream = tcpClient.GetStream(); <-- thought Timeout would raise here
// Further code here. But already tested while commented out.
// So everything else expect the code above shouldnt be relevant.
}
我想添加一個設置表單(router-ip / user / password)。 因此,在用戶端,如果用戶鍵入不存在的host-ip,可能會出現故障。
當前超時大約是20秒 ,這太高了。 TcpClient.ReceiveTimeout
和TcpClient.SendTimeout
設置了正確的超時設置,因為我已經嘗試過了。 Google並沒有幫助我。
因此,誰知道該如何以正確的方式設置超時時間? 我已經了解了異步。 我不想使用的連接。 更干凈的1行超時設置會很好。 可能?
非常感謝!
編輯1:在調試時仔細觀察,我發現tcpClient的初始化超時已經提高了(如我在上面的代碼中編輯的),而不是我以前在.GetStream()
想的。
編輯解決方案:
由於沒有人發布我選擇的解決方案中的工作代碼,因此它的工作方式如下:
public static void RouterConnect()
{
TcpClient tcpClient = new TcpClient();
if(tcpClient.ConnectAsync("192.168.80.1",23).Wait(TimeSpan.FromSeconds(2)))
{
NetworkStream nStream = tcpClient.GetStream();
}
else
{
MessageBox.Show("Could not connect!");
}
}
我知道的唯一方法是使用異步方法。 .Net 4.5中有一個不錯的新異步方法,它返回一個可以等待的Task,如下所示:
tcpClient.ConnectAsync().Wait(timeout)
如果不成功,則返回false。
您正在使用的當前構造函數重載方法也正在連接,因此將您阻塞,直到連接為止。
此外 , TcpClient
上沒有用於控制TcpClient
超時的屬性。
從MSDN : TcpClient(String, Int32)
初始化TcpClient類的新實例,並連接到指定主機上的指定端口。
來自MSDN的替代代碼
using (vartcp = new TcpClient())
{
IAsyncResult ar = tcp.BeginConnect("192.168.180.1", 23, null, null);
System.Threading.WaitHandle wh = ar.AsyncWaitHandle;
try
{
if (!ar.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(2), false))
{
tcp.Close();
throw new TimeoutException();
}
tcp.EndConnect(ar);
}
finally
{
wh.Close();
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.