簡體   English   中英

如何在 StreamSocket 的 ConnectAsync() 上設置超時值?

[英]How to set a timeout value on StreamSocket's ConnectAsync()?

在 Windows Phone 8.1 應用程序中,我必須按如下方式創建套接字。 我如何更改它以便它在我可以指定的時間段后超時?

_socket = new StreamSocket();
await _socket.ConnectAsync(hostName, port.ToString(), SocketProtectionLevel.PlainSocket);

await _socket.InputStream.ReadAsync(frameLenData, frameLenData.Capacity, Windows.Storage.Streams.InputStreamOptions.None);

在我的預 Windows 電話代碼中,我將創建套接字並通過測試_event.WaitOne(timeout)設置超時,例如

timeout = 5000;
_event = new ManualResetEvent(false);
_socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

bool bOperationFailed = false;
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = new DnsEndPoint(address, port);


_event.Reset();

_socket.ReceiveAsync(socketEventArg);

// Wait for completion
if (_event.WaitOne(timeout) == false)
{
    Trace.trace("timed out");
    return false;
}

我可以為StreamSocketConnectAsync()設置超時時間嗎? 如果是這樣,如何?

使用CancellationTokenSourceAsTask擴展方法。

var cts = new CancellationTokenSource();
cts.CancelAfter(2000); // cancel after 2 seconds

var connectAsync = _socket.ConnectAsync( ... );
var connectTask = connectAsync.AsTask(cts.Token);

await connectTask;   

由於我沒有添加評論的聲譽,我必須另外給出答案。

另一種不需要額外變量的方法:

await socket.ConnectAsync(hostName, port).AsTask(new CancellationTokenSource(TimeSpan.FromSeconds(2)).Token);

我做了以下,這似乎對我有用:

if (!_socket.ConnectAsync(uri, CancellationToken.None).Wait(timeout))
{
    // connect timed out
}

我嘗試使用 esskar 的答案/解決方案,但它沒有用,因為如前所述,我正在使用的最新版本的 .Net 中不存在 AsTask() 方法。

因此,我稍微調整了解決方案以執行以下操作,請檢查我的工作是否符合要求:

using (var sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp))
{
      var timeout = 1000;
      var cts = new CancellationTokenSource();
      cts.CancelAfter(timeout);

      var connectAsync = sock.ConnectAsync(address, port, cts.Token); // address and port set earlier in scope
      await connectAsync;          
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM