2016-07-20 3 views
0

ich eine StreamSocket in UWP haben und ich sende meinen Meldungen wie diese ein Datawriter Objekt mit dem StoreAsync() -Methode:UWP streamsocket ping networktimer gibt

 public static async Task<bool> SendNetworkMessage(NetworkMember member, NetworkMessage message) 
    { 
     DataWriter writer = member.DataWriter; 

     //Check that writer is not null 
     if (writer != null) 
     { 
      try 
      { 
       //Serialize Message 
       string stringToSend = SerializeObject<NetworkMessage>(message); 

       //Send Message Length 
       writer.WriteUInt32(writer.MeasureString(stringToSend)); 

       //Send Message 
       writer.WriteString(stringToSend); 

       await writer.StoreAsync(); 


       return true; 
      } 
      catch (Exception e) 
      { 

       Debug.WriteLine("DataWriter failed because of " + e.Message); 

       Debug.WriteLine(""); 

       Disconnect(member); 

       OnMemberDisconnectedEvent(member); 
       return false; 
      } 
     } 
     else { return false; } 
    } 

Alles ist gut, das einzige Problem ist, dass ich don Ich weiß nicht, ob eine Verbindung unterbrochen wurde. Jetzt möchte ich meine Verbindung mit einem DispatcherTimer wie folgt überprüfen:

 private static async void NetworkTimer_Tick(object sender, object e) 
    { 
     foreach (NetworkMember member in networkMemberCollection) 
     { 
      if (member.Connected == true && member.Disconnecting == false) 
      { 
       await SendNetworkMessage(member, new PingMessage()); 

      } 
     }} 

Doch diese Timing-Probleme verursacht, die ObjectDisposedExceptions auf dem Datawriter verursacht. Es scheint, dass der DispatcherTimer-Thread den StreamSocket nicht verwenden kann, wenn ich eine Nachricht von einem anderen Thread sende. Meine Frage ist: Wie kann ich sicherstellen, dass der Ping jedes Mal gesendet wird, aber dass SendNetworkMessage-Vorgänge in Reihenfolge statt überlappend ausgeführt werden?

Dank

Antwort

0

Es scheint, dass der DispatcherTimer Thread nicht den StreamSocket verwenden kann, wenn ich eine Nachricht von einem anderen Thread senden.

Wie kann ich sicherstellen, dass der Ping jedes Mal gesendet wird, aber dass SendNetworkMessage-Vorgänge in der Reihenfolge statt überlappend ausgeführt werden?

Es ist möglich, und ich denke, Ihr Code foreach und await Betrieb mit der Arbeit des Sendens Nachricht, um sicherstellen kann.

Das einzige Problem ist, dass ich nicht weiß, ob eine Verbindung unterging.

Wenn Sie wissen wollen, ob die Verbindung unterbrochen wurde, können Sie sich auf Handling WinRT StreamSocket disconnects (both server and client side) beziehen.