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

|