2017-02-25 23 views
1

我有一个StreamSocketListener注册在后台任务。后台StreamSocketListener只运行一次

当它收到请求时,Run方法开始。

运行状况良好的第一次,第二次我得到这个错误:

O identificador de objeto não representa um objeto válido. (Exception from HRESULT: 0x800710D8)

完整的代码是:

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    var deferral = taskInstance.GetDeferral(); 
    var details = (SocketActivityTriggerDetails)taskInstance.TriggerDetails; 
    var socketInformation = details.SocketInformation; 
    try 
    { 
     ShowToast(details.Reason.ToString()); 
     if (details.Reason == SocketActivityTriggerReason.ConnectionAccepted && 
      socketInformation.SocketKind == SocketActivityKind.StreamSocketListener) 
     { 
      using (IOutputStream output = socketInformation.StreamSocket.OutputStream) 
      { 
       string str = "Tudo certo\r\n"; 
       var conteudo = $"HTTP/1.1 200 OK\r\nConnection: Close\r\nContent-Length: {str.Length}\r\n\r\n{str}"; 
       using (Stream stream = output.AsStreamForWrite()) 
       { 
        var bodyArray = Encoding.UTF8.GetBytes(conteudo); 
        stream.Write(bodyArray, 0, bodyArray.Length); 
       } 
      } 
     } 
    } 
    catch (Exception e) 
    { 
     ShowToast(e.Message); 
     StreamSocketListener socket = new StreamSocketListener(); 
     socket.EnableTransferOwnership(taskInstance.Task.TaskId, SocketActivityConnectedStandbyAction.DoNotWake); 
     await socket.BindServiceNameAsync("8080"); 
     await socket.CancelIOAsync(); 
     socket.TransferOwnership("Teste"); 
    } 
    deferral.Complete(); 
} 

回答

1

根据StreamSocketTransferOwnership方法的言论:

Your app should call this method to transfer ownership of the StreamSocket to the socket brokering service when the app is about to be suspended, or at the end of a background task

所以在你的背景结束时,你应该调用TransferOwnership方法。您只能在catch区块中调用它,如果您的代码段成功尝试,它将不会调用TransferOwnership。您应该也可以在try块的末尾调用方法,或者在try和catch之后调用此方法以确保将StreamSocket的所有权转让给套接字代理服务。

我转载你的问题在我身边,并解决与socket.TransferOwnership("Teste");try块的最后一块。

try 
{ 
    ShowToast(details.Reason.ToString()); 
    if (details.Reason == SocketActivityTriggerReason.ConnectionAccepted && 
     socketInformation.SocketKind == SocketActivityKind.StreamSocketListener) 
    { 
     using (IOutputStream output = socketInformation.StreamSocket.OutputStream) 
     { 
      string str = "Tudo certo\r\n"; 
      var conteudo = $"HTTP/1.1 200 OK\r\nConnection: Close\r\nContent-Length: {str.Length}\r\n\r\n{str}"; 
      using (Stream stream = output.AsStreamForWrite()) 
      { 
       var bodyArray = Encoding.UTF8.GetBytes(conteudo); 
       stream.Write(bodyArray, 0, bodyArray.Length); 
      } 
     } 
    } 
    socket.TransferOwnership("Teste"); 
} 

更多详情请参考official sample

+0

官方示例只是告诉StreamSocket,而不是StreamSoketListener :( –