2016-08-18 3 views
1

私は、同じマシン上の同期クライアントソケットからデータを受信する同期サーバソケットとして機能するコンソールアプリケーションを持っています。テキストが明るすぎるとC#コンソールアプリケーションが停止するのはなぜですか?

クライアントからサーバーに何度かデータを送信した後、コンソールのテキストを強調表示するとコードの実行が停止し、クライアントが接続を確立できなくなることがわかりました。

私はこのようなことが起こる理由と、コードを実行させる方法があるかどうかを知りたいと思います。

+0

あなたは 'Console.ReadKey()'を持っていますか?私はこのまったく同じ問題を他の日にfunnily十分に持っていた –

+0

ときどき何かを選択しようとしているので、窓が一時停止にウィンドウを置き、それは結び目の速度で動いていた場合、あなたが望むビットを選択することはできません – BugFinder

+0

@CallumLiningtonいいえ、私はConsole.ReadKeyを使用していません。 –

答えて

1

コンソールは、(コンソールIOを多く行うプログラムの)無限大のデータをバッファリングしないように、ロックされています。あなたはここで、これを見ることができます:

using System; 
using System.Net; 
using System.Text; 
using System.Threading; 

static class P { 
    static void Main() { 
     using (var http = new HttpListener()) 
     { 
      http.Prefixes.Add("http://localhost:20000/"); 
      http.Start(); 

      ThreadPool.QueueUserWorkItem(delegate { 
       try { 
        while (true) { 
         var ctx = http.GetContext(); 
         Console.Write("."); // <===== this 
         var buffer = Encoding.UTF8.GetBytes(DateTime.Now.ToString()); 
         ctx.Response.OutputStream.Write(buffer, 0, buffer.Length); 
         ctx.Response.OutputStream.Close(); 
        } 
       } 
       catch { } 
      }); 

      Console.WriteLine("Running for 5 minutes..."); 
      Thread.Sleep(TimeSpan.FromMinutes(5)); 
      http.Stop(); 
     } 
    } 
} 

をあなたがこれを実行する場合、それはあなたがhttp://localhost:20000/を打ったときだけ、現在の時刻を書き込み、Webサーバを設定します。

Console.Write("."); // <===== this 

:あなたは、コンソール上の領域を選択した場合Webサーバは、この行のコンソール(ない良いアイデア)にアクセスしているため、現在のコードでは、それは、、Webサーバを中断しますそれでは、その行を削除(またはコメントアウト)して再試行してください。今度はは、Webサーバーがコンソールにアクセスしようとしないため、画面上のテキストを選択したときにWebサーバーを停止しません。

質問に答えるには、コンソールにアクセスするコードを見てください。これは通常、ある種のキュー(文字通りQueue<string>が問題ありません)にメインコードを書き込ませて出力を保持し、の異なる(重要ではない)スレッドがキューからコンソールに書き込むようにして実行できます。出力キューがブロックされると、誰も気にしません。

+0

私は今理解していると思います。非常に詳細に私の質問に答えるために時間を費やしてくれてありがとう。 –

関連する問題