2017-02-25 4 views
1

Ich habe eine StreamSocketListener in einer Hintergrundaufgabe registriert.Hintergrund StreamSocketListener nur einmal ausgeführt

Wenn eine Anforderung empfangen wird, startet die Methode Run.

Das erste Mal ist es gut läuft, bekommen das zweite Mal, dass ich diesen Fehler:

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

Der vollständige Code ist:

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

Antwort

1

Nach den Ausführungen von TransferOwnership Methode der StreamSocket Klasse:

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

Also am Ende Ihres Hintergrunds sollten Sie 0 anrufenMethode. Sie rufen es nur in catch Block, wenn Ihr Code-Snippet erfolgreich versuchen wird TransferOwnership nicht aufgerufen werden. Sie sollten in der Lage sein, die Methode auch beim letzten Block try aufzurufen oder nach try und catch schließlich diese Methode aufzurufen, um den Übertragungsbesitz des StreamSocket an den Socket Brokering Service sicherzustellen.

Ich reproduziert Ihr Problem auf meiner Seite und gelöst mit socket.TransferOwnership("Teste"); bis zum letzten try Block.

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

Mehr Details bitte verweisen auf die official sample.

+0

Die offizielle Probe erzählen nur über StreamSocket, und nicht StreamSoketListener :( –

Verwandte Themen