2011-11-30 8 views
3

私のXNAゲームでは、ゲームウィンドウと、Console.ReadLine()を実行しているコンソールがあり、スクリプト入力を待っている間にゲームがハングしないようにしています。私は、ゲームウィンドウが閉じると、コンソールが自動的に閉じて、実際に入力する(入力を待っている間に物事を印刷する機能を備えている)場所を取得しようとしています。 この質問のコードを使用すると、自動的に閉じられるようになりました。How to add a Timeout to Console.ReadLine()?Console ReadLineを終了する

ただし、入力にEnterキーを押すと、ObjectDisposedExceptionがスローされます。また、タイムアウトを使用することに悩まされています。これを修正するにはどうすればいいですか?

LuaInput = new ConsoleInput(); 
LuaInputThread = new Thread(new ThreadStart(LuaInput.Run)); 
LuaInputThread.Start(); 

ありがとう:によって呼び出され

public class ConsoleInput 
{ 
    public bool running = true; 

    public void Run() 
    { 
     String input; 
     while (running) 
     { 
      input = ReadLine(500); 
      //stuff 
     } 
    } 

    string ReadLine(int timeoutms) 
    { 
     ReadLineDelegate d = Console.ReadLine; 
     IAsyncResult result = d.BeginInvoke(null, null); 
     result.AsyncWaitHandle.WaitOne(timeoutms);//timeout e.g. 15000 for 15 secs 
     if (result.IsCompleted) 
     { 
      string resultstr = d.EndInvoke(result); 
      Console.WriteLine("Read: " + resultstr); 
      return resultstr; 
     } 
     result.AsyncWaitHandle.Dispose(); 
     return ""; 
    } 

    delegate string ReadLineDelegate(); 
} 

+0

確かに、あなたは待機ハンドルを配置しました。しないでください。 EndInvoke()メソッドを呼び出さないことは、10分間持続するかなり面倒なリソースリークです。あなたがこれを頻繁にやっていないならば。 –

答えて

1

あなたは、スレッドの

IsBackground = true;を設定しようとしたことがありますか?これにより強制的に閉じられ、スレッドがブロックされません。

+0

完璧に動作します!ありがとう。 – pajm

関連する問題