前提・実現したいこと
Uiが絡む非同期処理で、デバッグ実行時とビルド→.exe実行時で処理結果が異なります。
具体的には、以下ソースコードでデバッグ実行時は例外が発生しますが、exeを実行した場合には
例外が発生しません。
ビルド実行時に発生する例外は別スレッドからUIを変更しにいっているので発生する
ということはわかるのですが、exe実行だとこの例外がなぜ発生しなくなるのかがわかりません。
ご教示よろしくお願いいたいします。
【追記】
~~exeで実行した場合、textに正しく文字列が設定され
~~
exeで実行した場合、1~100までの文字のうち
いくつかが抜けた状態で「正常終了」のメッセージがポップアップされます。
デバッグ実行時に発生する例外
該当のソースコード
C#
1private void button1_Click(object sender, EventArgs e) 2{ 3 Enumerable 4 .Range(1, 100) 5 .AsParallel() 6 .ForAll(z => 7 { 8 this.textBox1.Text += z.ToString(); 9 }); 10 MessageBox.Show("正常終了"); 11} 12
> .exe実行時で処理結果が異なります。
その時結果はどうなるのですか? TextBox に結果が書き込まれて、"正常終了" のメッセージが表示されますか? でなければ、.exe 実行の際には例外が表示されてないだけということはありませんか?
ご指摘ありがとうございます。
exe実行時の挙動を追記しました。
.exe実行時(VS から[デバッグなしで開始]と同じ)でも例外はスローされていて、それが捕捉できないから正常終了したように見えるということのようです。
tamoto さんの回答を見てください。VS から[デバッグの開始]の場合は CheckForIllegalCrossThread が true に設定されるようです。button1_Click の中の最初の行に CheckForIllegalCrossThread = true; と一行入れると .exe実行時(VS から[デバッグなしで開始]と同じ)でも例外は捕捉されます。
ご参考:
方法: Windows フォーム コントロールのスレッド セーフな呼び出しを行う
https://docs.microsoft.com/ja-jp/dotnet/framework/winforms/controls/how-to-make-thread-safe-calls-to-windows-forms-controls
はい、やってみました。
おっしゃる通りの挙動になりました。
参考情報ありがとうございます。
回答1件
あなたの回答
tips
プレビュー