2012-01-24 6 views
10

私のコンソールアプリケーションは、完全にユーザーインターフェイス専用のスレッドを実行しています.(この呼び出しは.NETフレームワークの制御の外にあるWindowsの内部に深い時間を費やしています) 。上記のスレッドがConsole.ReadLineを実行しているときに、.NETで別のスレッドを中止する方法

このスレッドを中止する必要があります。しかし、次のコードは動作していないようです:

this.UserInterfaceThread.Abort(); 

アイデアはありますか? Thread.Interrupt()はどんな使い方ですか?

更新

ハンスアンパッサンは指摘したように:それを中断するとき

CLRは、スレッドの状態ではなく健全ルールを課します。 Thread.Abort()の危険性はよく知られていますが、確かに確実に動作しないものは、アンマネージコードを実行しているスレッドを中止することです。 Console.ReadLine()を呼び出すと、スレッドはWindowsオペレーティングシステムのコードの内部に埋め込まれます。

解決策は、現在実行中のコンソールアプリケーションに[enter]キーストロークを押し込むだけで、Console.ReadLine()をブロック解除するので、スレッドはすぐに中止されます。

can notこれはWindowsフォームに固有のもので、現在のウィンドウにフォーカスを当てる必要があるため、SendKeysを使用します。

解決策は、Windows SendInput()呼び出しをラップするinputsimulator.codeplex.comのライブラリを使用することです。

参照サンプルコード:

.NET call to send [enter] keystroke into the current process, which is a console app?

+0

[Console.ReadLine()にタイムアウトを追加する方法?](http://stackoverflow.com/questions/57615/how-to-add-a-timeout-to-console-readline) –

+3

'Thread.Abort' [悪です](http://www.interact-sw.co.uk/iangblog/2004/11/12/cancellation)。 – spender

+0

@ダリン・ディミトロフ:その複製ではありません。この質問は、Console.ReadLine()の単一のインスタンスを実行しているスレッドを中断する方法を扱います。 – Contango

答えて

4

利用のSendKeysとENTERキーをシミュレートします。ヘルプhereを入手してください。

幸運。

+1

チップをありがとう。私はコンソールアプリケーションを使用しているので、SendKeysが動作しない可能性があります。 – Contango

+0

http://inputsimulator.codeplex.com/が見つかりました。コンソールアプリのキーストロークをシミュレートすることができます。 – Contango

+0

http://inputsimulator.codeplex.com/を使用して終了しました。ここでの完全な回答を参照してください:http://stackoverflow.com/questions/9016087/net-call-to-send-enter-keystroke-into-the-current-process-which-is-a-console – Contango

6

CLRは、スレッドを中止するときにスレッドの状態にかなり正式なルールを適用します。 Thread.Abort()の危険性はよく知られていますが、確かに確実に動作しないものは、アンマネージコードを実行しているスレッドを中止することです。 Console.ReadLine()を呼び出すと、スレッドはWindowsオペレーティングシステムのコードの内部に埋め込まれます。

これは別の方法で行う必要があります。ただちに明白なアプローチの1つは、この「ユーザーインターフェイス」スレッドがプログラムを他の方法で停止させることです。 「quit」コマンドや、「続けるために任意のキーを押してください」というメッセージと同じくらい単純なものにすることができます。

スレッドのIsBackgroundプロパティをtrueに設定します。これで中止する必要はありません.Windowsは、Main()メソッドが終了した後にプロセスをシャットダウンすると、Windowsを終了します。

+0

ここで何が起こっているのかを説明してくれてありがとう。私は別のアイデアを持っています:コンソールアプリケーションに[enter]キーを押し込んで、スレッドを起床させて強制終了させる方法はありますか?これを行う方法があります:System.Windows.Forms.SendKeys.SendWait() – Contango

+0

これはあまりにも醜いです、SendKeys()は非常に信頼性がありません。コンソール入力ハンドルを閉じることでConsole.ReadLine()を返すことができます(http://stackoverflow.com/a/9479797/17034) –

2

で呼び出してもConsole.ReadLine()を呼び出しているスレッドでは、Thread.Abort()でもThread.Interrupt()も動作しません。

私はさらにConsole.In.Close()Dispose()を呼び出してみました。あなたが読んでいたら、あなたは本当にそこにいるようです。それはストリームのデザインを破るように見えるので奇妙です。それは本当にあなたの唯一のオプションのように見えます

は@で述べた答えを使用することですダーリン・ディミトロフ

編集: ノックリストオフ別の1:Win32 APIのFreeConsoleを呼び出してみました。 Console.ReadLine()からメモリ破損例外を発生させます。

+0

私は別のアイデアを持っています:コンソールに[enter]キーを押し込む方法アプリを起動してスレッドを強制的に強制終了します。これを行うメソッドがあります:System.Windows.Forms.SendKeys.SendWait() – Contango

関連する問題