public async void Run(IBackgroundTaskInstance taskInstance)
{
using (new BackgroundTaskDeferralWrapper(taskInstance.GetDeferral()))
{
try
{
var details = (SocketActivityTriggerDetails)taskInstance.TriggerDetails;
switch (details.Reason)
{
case SocketActivityTriggerReason.SocketActivity:
string request = null;
using (var socketOperation = Hub.Instance.SignalingSocketService.SocketOperation)
{
if (socketOperation.Socket != null)
{
var socket = socketOperation.Socket;
const uint length = 65536;
var readBuf = new Buffer(length);
var readOp = socket.InputStream.ReadAsync(readBuf, length, InputStreamOptions.Partial);
// This delay is to limit how long we wait for reading.
// StreamSocket has no ability to peek to see if there's any
// data waiting to be read. So we have to limit it this way.
for (int i = 0; i < 100 && readOp.Status == Windows.Foundation.AsyncStatus.Started; ++i)
{
await Task.Delay(10);
}
await socket.CancelIOAsync();
try
{
var localBuffer = await readOp;
var dataReader = DataReader.FromBuffer(localBuffer);
request = dataReader.ReadString(dataReader.UnconsumedBufferLength);
}
catch (Exception ex)
{
Debug.WriteLine($"ReadAsync exception probably due to timeout: {ex.Message}");
}
}
}
if (request != null)
{
Hub.Instance.SignalingClient.HandleRequest(request);
}
break;
case SocketActivityTriggerReason.KeepAliveTimerExpired:
Hub.Instance.SignalingClient.ClientHeartBeat();
break;
case SocketActivityTriggerReason.SocketClosed:
Hub.Instance.SignalingClient.ServerConnectionError();
//ToastNotificationService.ShowToastNotification("Disconnected.");
break;
}
}
catch (Exception exception)
{
Hub.Instance.SignalingClient.ServerConnectionError();
ToastNotificationService.ShowToastNotification(string.Format("Error in SignalingTask: {0}",
exception.Message));
}
}
}