Reputation: 42225
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 _event.WaitOne(timeout)
, 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);
_event.Reset();
_socket.ReceiveAsync(socketEventArg);
// Wait for completion
if (_event.WaitOne(timeout) == false)
{
Trace.trace("timed out");
return false;
}
Can I set the timeout period for StreamSocket
's ConnectAsync()
? If so, how?
Upvotes: 7
Views: 6128
Reputation: 11
I tried using esskar's answer/solution but it didn't work since, as has been previously mentioned, the AsTask() method doesn't exist in latest version of .Net that I'm using.
So, I tweaked the solution just a tad to do the following, please check my work to see if this meets the requirements:
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;
}
Upvotes: 1
Reputation: 411
I do the following, which seems to work for me:
if (!_socket.ConnectAsync(uri, CancellationToken.None).Wait(timeout))
{
// connect timed out
}
Upvotes: 1
Reputation: 853
Since I do not have the reputation to add a comment I have to put it another answer.
Another way that doesn't require extra variables if they aren't required:
await socket.ConnectAsync(hostName, port).AsTask(new CancellationTokenSource(TimeSpan.FromSeconds(2)).Token);
Upvotes: 3
Reputation: 10970
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;
Upvotes: 9