2016-11-22 3 views
1

Von einem Beispiel der MSDN, ich versuche, die empfangenen Daten von Datagram in meinem Hintergrundaufgabe mit dem Socket-Broker abgerufen und die SocketActivityTrigger.Holen Sie Daten von SocketActivityTriggerDetails mit Datagram

Aber das Beispiel in der Verbindung dargestellt ist für StreamSocket:

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    var details = taskInstance.TriggerDetails as SocketActivityTriggerDetails; 
    var socketInformation = details.SocketInformation; 
    switch (details.Reason) 
    { 
     case SocketActivityTriggerReason.SocketActivity: 
      var socket = socketInformation.StreamSocket; 
      DataReader reader = new DataReader(socket.InputStream); 
      reader.InputStreamOptions = InputStreamOptions.Partial; 
      await reader.LoadAsync(250); 
      var dataString = reader.ReadString(reader.UnconsumedBufferLength); 
      break; 
    } 
} 

Ich kann die empfangenen Daten von DatagramSocket Objekt finden, wir haben nur Zugriff auf den Ausgabestrom ..

Wie Kann ich tun ?

Danke!

Antwort

0

Ich kann die empfangenen Daten von Datagram Objekt finden wir nur Zugriff auf den Ausgangsstrom haben ..

Für DatagramSocket Objekt, wenn wir Daten empfangen müssen, müssen wir fitstly seine registrieren MessageReceived event, und dann in seinem DatagramSocketMessageReceivedEventArgs, können wir seine GetDataReader method verwenden, um die übertragenen Daten zu erhalten.

Für die Hintergrundaufgabe ähnelt der Code der official Socket activity trigger stream socket sample. Aber für DatagramSocket müssen wir dieses Ereignis MessageReceived registrieren und die Daten in der Hintergrundaufgabe behandeln.

Nur zum Beispiel hier:

public async void Run(IBackgroundTaskInstance taskInstance) 
{ 
    var deferral = taskInstance.GetDeferral(); 
    try 
    { 
     var details = taskInstance.TriggerDetails as SocketActivityTriggerDetails; 
     var socketInformation = details.SocketInformation; 
     switch (details.Reason) 
     { 
      case SocketActivityTriggerReason.SocketActivity: 
       var socket = socketInformation.DatagramSocket; 
       socket.MessageReceived += Socket_MessageReceived; 
       break; 
      default: 
       break; 
     } 
     deferral.Complete(); 
    } 
    catch (Exception exception) 
    { 
     ShowToast(exception.Message); 
     deferral.Complete(); 
    } 
} 

private void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) 
{ 
    using (var reader = args.GetDataReader()) 
    { 
     //TODO: read data here. 
    } 
} 
+1

@ grace-feng-msft Vielen Dank für Ihre Antwort aber .. Ich denke, Sie verstehen nicht das Verhalten hinter dem ** SocketActivityTrigger **. In der Tat übernehmen die Broker-Socket Besitz der DatagramSocket, die wir im Vordergrund erstellen, und wenn es ein Paket empfängt, startet es die Hintergrundaufgabe. So .. abonnieren MessageReceived Ereignis ** ist zu spät **, das Paket wurde bereits erhalten :( –

+0

Niemand sonst kann mir helfen? –

+0

@ApynAOM Haben Sie es geschafft, dies zu lösen? –

0

Sie müssen rufen EnableOwnerShip, TransferOwnerShip Methoden nach bindServiceName oder bindEndPoint. Ich arbeite jetzt dieses Thema ..