VS2005で実行されているプログラムと実行ファイルを直接実行しているプログラムに奇妙な違いがあります。基本的に、Application.DoEvents()
呼び出し内のメソッドで例外がスローされると、Visual Studio内で実行されているときに例外が検出される可能性があります。コンパイルされた実行可能ファイルを実行すると、例外は捕捉されず、プログラムがクラッシュします。Application.DoEvents()の内部から例外をキャッチすることはできますか?
問題を示す簡単なコードを次に示します。標準的なwinforms定型句と2つのボタンとラベルを想定します。
これを実行するには、開始ボタンをクリックして10秒カウントを開始します。 10秒間が経過する前に、中止ボタンを押してください。 DoEvents()
の内部に例外がスローされます。例外は捕捉されるべきです。これは、Visual Studio内で実行している場合にのみ発生します。
private void StartButton_Click(object sender, EventArgs e) {
DateTime start = DateTime.Now;
try {
while (DateTime.Now - start < new TimeSpan(0, 0, 10)) {
this.StatusLabel.Text = DateTime.Now.ToLongTimeString();
Application.DoEvents();
}
MessageBox.Show("Completed with no interuption.");
} catch (Exception) {
MessageBox.Show("User aborted.");
}
}
private void ButtonAbort_Click(object sender, EventArgs e) {
throw new Exception("aborted");
}
私はこれらの例外を捕捉したいと考えています。それを動作させる方法はありますか?
更新:
私は再入-頭痛を誘発DoEvents()
以外のアプローチを検討するつもりです。しかし、私はより良く働くように見えるものは見つけていません。私のシナリオでは、私はいくつかの科学機器を制御している長い実行ループがあり、しばしば温度が安定するか何かを待たなければならないということです。ユーザーにプロセスを中止する機能を与えたいので、プロセスが最初に開始されたサイトでキャッチする予定のカスタム例外をスローするアボートボタンがあります。それは完璧な解決策に見えました。それは何らかの理由でうまくいかないという事実を除いて。
これを機能させることができない場合は、より良いアプローチがありますか?
アップデート2:
私はVSではない、それは実行可能ファイルとして動作しますメインの最初の行()、としてこれを追加し、しかし、その状況が逆転しています。狂ったことは、それがノーオペレーションであるように見えるということです。私はこれがどのようになるかを理解することができます。
Application.ThreadException += delegate(
object sender,
System.Threading.ThreadExceptionEventArgs e
)
{ throw e.Exception; };
これは非常識です。
私は意図的にこれをやりました。ユーザーに、長時間実行している外部プロセスを待っている時間を費やしている長時間実行中のプロセスを中止するアボートボタンを提供したいと考えています。 DoEventsなしでこれを行う最善の方法は何ですか? (OPの新しいアップデートも参照してください) – recursive
くそ、Skeet。私はあなたがこれを編集している間に慎重に私の小さな答えを作り出していました。 –
私はいつもスレッドを避けなければならないと聞いてきました。可能性があるのであれば、デバッグが難しいからです。あなたの編集の文言は、UI以外の操作(すべてのアプリケーション)を持つすべてのアプリケーションがマルチスレッドでなければならないことを示唆しています。よくわかりません。 – recursive