- - PR -
「InvokeRequired=True」と「デバッグなしで開始」と「デバッグ開始」
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-12-12 16:11
スレッドセーフってマルチスレッドで動かしても大丈夫だよっていう「保証書」見たいなものだから、保証外のことをするときは「個人の責任」でってことでしょうね
なにが起こるかわからないから、スレッドセーフではないということだと思います。 | ||||||||
|
投稿日時: 2008-12-12 17:00
そういえばそうでした (^^; すっかり遠い記憶の彼方でした。
.NET 2.x ランタイムは、.NET 1.x のアプリケーションの実行をサポートしています。 そのため、.NET 1.x 時代に作られた「スレッド跨ぎのメンバアクセスをしているけど、動いちゃってたアプリ」を引き続き動作させるために、単独実行時には例外を throw しないことにしたんでしょう。 .NET 1.x 時代から、スレッド跨ぎのメンバアクセスは「ダメ」とされてましたが、実際に問題を生じるかどうかはそのメンバの実装に大きく左右されます。 .NET 1.x 時代のコントロールはメンバアクセスがスレッド跨ぎであるかどうかのチェックを(たぶん)まるでやっていなかったので、.NET 2.x 登場時には既に、「ダメなことを知らない人が作ったダメなアプリ」が蔓延してしまっていたのです。 | ||||||||
|
投稿日時: 2008-12-15 10:31
コメントいただいた方々ありがとうございます。
マルチスレッドアクセスにより、発生する可能性のある「なにか」を防ぐために、 .NET Framework 2.0以降では、仕様を変更したのだけれども、 その変更により、.NET Framework 2.0以前に作られた、 数多あるお作法を無視したアプリケーションが動かなくなってしまうしまうことは、 開発者、利用者や社会に対する影響が大きいと考え、その救済として、 デバッグ実行の時のみ、エラーになるようにした。 つまり、この現象は、問題を改修したいのだけれども、 互換性も保証しなければいけないというジレンマに対する、 MSの出した回答ということと勝手に解釈いたしました。 大変勉強になりました。ありがとうございます。 |