質問: ### 前提・実現したいこと Uiが絡む非同期処理で、デバッグ実行時とビルド→.exe実行時で処理結果が異なります。 具体的には、以下ソースコードでデバッグ実行時は例外が発生しますが、exeを実行した場合には 例外が発生しません。 ビルド実行時に発生する例外は別スレッドからUIを変更しにいっているので発生する ということはわかるのですが、exe実行だとこの例外がなぜ発生しなくなるのかがわかりません。 ご教示よろしくお願いいたいします。 【追記】 ~~exeで実行した場合、textに正しく文字列が設定され~~ exeで実行した場合、1~100までの文字のうち いくつかが抜けた状態で「正常終了」のメッセージがポップアップされます。 ### デバッグ実行時に発生する例外 ![![イメージ説明](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/2a597bcb981b7cd13dc7fe9da92a9eea.jpeg) ### 該当のソースコード ``` private void button1_Click(object sender, EventArgs e) { Enumerable .Range(1, 100) .AsParallel() .ForAll(z => { this.textBox1.Text += z.ToString(); }); MessageBox.Show("正常終了"); } ```
回答: こんにちは。 `button1_Click` に以下のように書いてみてください。 ``` MessageBox.Show(CheckForIllegalCrossThreadCalls.ToString()); ``` これは Control クラスの static プロパティで、UI スレッドへのアクセス違反をチェックするかどうかを示す bool 値が入っています。 これがデバッグ実行時と直接実行時で異なる値を返しているはずです。 デバッガが UI スレッドアクセス違反を検出できるように、どこかのバージョンで追加されたパラメータだったはずです。 つまり、直接実行でも相変わらず例外は出ているが、それを検知できていないだけということです。