2016-07-12 27 views
0

有人可以解釋我爲什麼得到此流不支持超時。錯誤。此流上不支持超時

如果我使用我的代碼這樣的事情很好。我的套接字連接到服務器和服務器信息。 (這種方法就像假人導致連接是發生了一臺服務器,並在一切開始)

private async Task Update() 
    { 
     while (true) 
     { 
      server = Ips.First(); 
      if (server.Map != sq.map || server.Name != sq.name || server.Players != sq.players) 
      { 
       return; 
      } 
     } 
    } 

而在真正的應用程序,我需要查詢大量的服務器。所以我嘗試這樣的事情(因爲我是小白和不能想出更好的辦法)

foreach (var server in Ips) 
      { 
       sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port); 

       if (server.Map != sq.map || server.Name != sq.name || server.Players != sq.players) 
       { 
        return; 
       } 
      } 

而這正是我得到超時不支持此流的錯誤。有人可以解釋爲什麼,也許告訴我我應該在哪裏看?

我的錯誤出現在這個方法的第一行: (流streamIn = args.GetDataStream()AsStreamForRead();)

 private async void Socket_MessageReceived(DatagramSocket sender, DatagramSocketMessageReceivedEventArgs args) 
    { 

     Stream streamIn = args.GetDataStream().AsStreamForRead(); 
     StreamReader reader = new StreamReader(streamIn); 
     string message = await reader.ReadToEndAsync(); 
     byte[] packet = System.Text.Encoding.ASCII.GetBytes(message); 
     Parser parser = new Parser(packet); 
+0

請記住,從互聯網收到的數據必須由應用程序立即處理或保存,否則將會丟失(這是緊急I/O)。這就是錯誤所說的。 –

+0

但爲什麼第一種方法有效? – Myrez

+0

因爲超時是由於一次做很多事情造成的,只做一兩件事情並不意味着相同數量的負載。有1或2件事情是有時間處理所有。隨着更多,它不是。 –

回答

1

但是爲什麼第一種方法的工作?

你的第一個代碼塊,第二個之間的主要區別是sq.Connect(new Windows.Networking.HostName(server.Ip), server.Port);,底座上你的代碼,很可能

  • 只連接到Ips.First(),並且運行的代碼爲「迴歸「跳出」foreach「。

  • 您建立兩個(或多個)連接,直到代碼運行到「返回」。

我不知道你是什麼sq,並且在DatagramSocket class沒有Connect(hostname, serverport)方法,只有一個類似的方法,但一個aysnc之一:DatagramSocket.ConnectAsync(HostName, String) | connectAsync(HostName, String) method

映射到兩種可能性I中列出了:

  • 如果在「的foreach」只運行一次代碼(指Ips.First()接通),則兩個碼塊之間的差是你建立一個連接第二個代碼,這可能是一個原因。

  • 第二個可能性,我假設你正在使用ConnectAsync方法實際上,然後sqc sq = new DatagramSocket();,並且它使用一個DatagramSocket連接到多臺服務器。但ConnectAsync方法是用於與單個遠程端點進行通信,所以我認爲這也可能是此處的原因。

而在真正的應用程序,我需要查詢大量的服務器。

我認爲您的方案,,最好不要使用連接,你可以綁定你DatagramSocket到本地端口,並加入一個DatagramSocket對象多播組。你可以參考官方的DatagramSocket sample,場景5是針對多播和廣播的,你可以看看。

如果您在這裏有任何問題,請留下評論。

+0

sq是ServerQuery()它包含datagramsocket和connectasync。我修好了。只是嘗試了一切,並忽略了異常,所以可能是因爲應用程序仍在加載? (也許?)真正的目標是用戶可以將他自己的服務器添加到可觀察集合(我的意思是IP /端口),應用程序將查詢他們的數據。那麼我應該使用組播嗎? – Myrez

+0

@Myrez,是的,我認爲是這樣,使用多播更好。 –

+0

好,謝謝!我經理讓它工作。無論如何,你會看到我所做的這件事:D你會笑一個星期。 – Myrez