皇紀2665/04/01(金) 15:28:25
>>544
> デリゲートを使用しているのですが、これはなぜでしょうか?
Invokeを使うから。
デリゲートというのは、メソッドそのものを変数に代入できるようにしたもの。
そうすることで、例えばデリゲートを引数に取るメソッドを書くと、そのメソッド先で“デリゲートで指定されたメソッド”を実行できるようになるわけ。
で、Invokeメソッドはデリゲートを引数に取るから、デリゲートを作ってるわけ。
InvokeメソッドはForm(の基底クラスのControl)に実装されたもので、
「“自分を作ったスレッド”で、“渡されたデリゲートで指定されたメソッド”を実行する」
という働きをする。
デリゲートもクラスの一種なんだけど、宣言すると自動的にBeginInvoke/EndInvokeと言うメソッドが追加される。
これが非同期デリゲートと言って、BeginInvokeを呼び出すとそのデリゲートに指定されているメソッドが別スレッドで実行される事になる。
んだけれども、この場合は関係ない話なので、非同期デリゲートの事は棚に上げておいて良い。
あと一応フォローしておくと、「非同期で実行」=「別スレッドで実行」。
> 普通にButton1.Enabled = true とするとどうなってしまうの?
なぜInvokeを使うか、というのの詳細は面倒なので省略。
・必ずコントロールを作成したのと同じスレッドで操作しなければならない
・作成スレッドと同じスレッドで操作するのにはそのコントロールのInvokeまたはBeginInvokeを使う
・その操作処理はデリゲートでラップしてInvoke/BeginInvokeの引数に渡す
という点だけ覚えればいい。
そうしない場合、「何が起こるかは保証されない」。