2016-07-20 5 views
0

내가 UWP에 StreamSocket을 발행하고 나는 StoreAsync를 사용하여 DataWriter 객체를 사용하여이처럼 내 메시지를 보내() 메소드 :UWP streamsocket 핑 networktimer이

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

모두 잘, 유일한 문제는 내가 돈 연결이 끊어 졌는지 알 수 없습니다. 지금 나는이 같은 DispatcherTimer를 사용하여 내 연결을 확인하려면 :

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

      } 
     }} 

그러나, 이것은 DataWriter에 ObjectDisposedExceptions의 원인이되는 타이밍 문제를 일으키는 것입니다. DispatcherTimer 스레드는 다른 스레드에서 메시지를 보낼 때 StreamSocket을 사용할 수 없습니다. 내 질문은 : Ping이 매번 전송되지만 SendNetworkMessage 작업이 겹치기보다는 순서대로 수행되도록하려면 어떻게해야합니까?

감사

답변

0

내가 다른 스레드에서 메시지를 보낼 때 DispatcherTimer 스레드가 StreamSocket을 사용할 수 없습니다 것 같다.

Ping이 매번 전송되지만 SendNetworkMessage 작업이 겹치기보다는 순서대로 완료되는지 어떻게 확인할 수 있습니까?

이 가능하고, 난 당신의 코드가 순서대로 메시지를 전송하는 작업을 보장 할 수 foreachawait 작업을 사용하여 생각합니다.

유일한 문제는 연결이 끊어 지는지 잘 모르겠다는 것입니다.

연결이 끊어 졌는지 알고 싶으면 Handling WinRT StreamSocket disconnects (both server and client side)을 참조하십시오.