プロプログラマ

プログラマーを職業としてます。 Flex,Air,C#,Oracle,HTML+JSの言語ノウハウを中心に情報発信していきます

[C#] スレッド処理からコントロールにアクセスしてもエラーにならないようにする

C#からスレッドを生成して動作させている場合、そのスレッド内から、フォーム上のコントロールに対してアクセスしようとすると、エラーが発生します。
これは、フォームがスレッドセーフな実装になっていないためです。

エラーを回避するには、直接コントロールのプロパティにアクセスせずに、デリゲートやスレッドセーフな変数を経由する必要があります。
スレッドの素人には、この対応がなかなか難しいところです。

ですが、このエラー。
下記の1文をを書くだけでエラーが発生しなくなります。

スレッドからアクセスするコントロールに対して、
たとえば、

DataGridView.CheckForIllegalCrossThreadCalls = False;

(静的プロパティです。)

このようにすると、スレッド内からこのコントロールにアクセスしてもエラーが表示されず、処理が流れます。
とても簡単ですね。

ただし、この記述はエラーを発生させないだけで、複数のスレッドからアクセスしようとした場合に、正しく処理される保証がされるわけではありません。何が起こるか分かりません。
=解決してない。

なので、絶対に問題が発生しないと分かっているときは使用してもいいんですが、基本的にはスレッドセーフにコントロールへアクセスする実装を書くべきです。

でも面倒なので簡単な処理なら、上記一文でもまぁ問題ないかもしれません。
安易に使わないように気をつけましょう。(=自分)

 

== ランキングに参加しています。ぜひクリックお願いします ==

プログラム ブログランキングへ
にほんブログ村 IT技術ブログへ
にほんブログ村

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください