2009-05-25 17 views
2

私は、ConsoleReadの型であるTextReaderにBeginReadメソッドがないことに気付きました。Console.Inからの非同期読み取り

Console.Inから非同期読み取りを実現するにはどうすればよいですか?

私の最初のアイデアは、stdinへのハンドルを取得し、そのハンドルが信号を送るのを待つようにウェイターを取得することです。しかし、これには多くのWin32呼び出しが含まれていました。

もっと簡単な方法がありますか?おそらく、 の行に何か:

Stream s = (Stream) Console.In; 
s.BeginRead(..) 

任意のアイデア?

+0

この質問に私の答えと同様の何かをすることができますhttp://stackoverflow.com/a/23628232/659190 – Jodrell

答えて

0

Console.Readへの呼び出しをスレッド化し、すべての読み取りデータをどこかに格納する独自のクラスを作成します。その後、EndReadでスレッドを終了し、読み込んだデータを返します。

+1

そのスレッドは、読み取り呼び出しでブロックされます。どのようにブロックを解除するのですか? (制御されたシャットダウンのために言ってください)あなたはThread.Abort()を提案していますか? ストリームからの読み取りを未定義の状態にすることはできませんでしたか? /L – leiflundgren

+0

私は個人的にクラス内のメソッドを使用してスレッドを中止し、リソースを明示的にクリーンアップします。私はそれが面倒な解決策だが、ストリームのデータをチェックする方法がないことを知っている。Thread.Abort()は私が考えることができる唯一の解決策である。 – Stephan

3

Console.KeyAvailableを別のスレッドでポーリングし、利用可能になるとすぐにデータを読み取ることができます。