DaveDev DaveDev - 1 year ago 254
C# Question

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

In the Windows Phone 8.1 app I had to create my socket as follows. How can I change it so that it will timeout after a period that I can specify?

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

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

In my pre- Windows Phone code I'd create the Socket and set the timeout by testing
, e.g.

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);



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

Can I set the timeout period for
? If so, how?

Answer Source

Use a CancellationTokenSource and AsTask extension method.

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

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

await connectTask;   
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download