3

私が読んだものから、デリゲートの定義は次のとおりです。

デリゲートは、メソッドを参照する型です。デリゲートにメソッドが割り当てられると、そのメソッドとまったく同じように動作します。デリゲートメソッドは、他のメソッドと同じように、パラメーターと戻り値を使用して使用できます。

これで、デリゲートを使用してスレッドを介してテキストボックスを言うフォームオブジェクトに書き込む方法を理解しましたが、デリゲートでアドレス指定されたメソッドがフォーム上のすべてのオブジェクトにアクセスする方法を理解できません。誰かがこれを片付けることができれば幸いです。

編集:これがデリゲートを作成する方法です

public delegate void MyDelegate(string str,int str2);

void main()
{
Thread t = new Thread(RunInThread); //Method that will run in a separate thread
t.Start();
}
void RunInThread ()
{
MyDelegate delInstatnce = new MyDelegate(AddControl); //Attach a method
this.Invoke(delInstatnce,"First Parameter",1001);
}
void AddControl(string str,int str2)
{
  //Why could you access all the form components from here ?
}
4

1 に答える 1

2

まず、これはデリゲートのかなり混乱した説明です。デリゲートとイベントに関する私の記事が役立つかもしれません。

第二に、タイトルと本文が異なることについて話していることを考えると、あなたの質問が何であるかが明確ではありません.

デリゲートは事実上、クラス内でメソッドを呼び出すという概念をカプセル化した単なるオブジェクトです。そのメソッドへのアクセシビリティは、実行時ではなく、デリゲートの作成時に制御されます。たとえば、クラス内のコードは、プライベート メソッドを参照するデリゲートを作成でき、そのデリゲートはクラス外のコードに返されます...呼び出されると、プライベート メソッドが呼び出されます。これは、プライベート メソッドにアクセスできるコードのみがデリゲート インスタンスを作成できるため、アクセスに関しては依然として "安全" です。プライベート メソッド内では、コードは通常の方法で他のすべてのメンバーにアクセスできます。

今、あなたのタイトルはスレッドについて語っています...そしてデリゲートを使用しても、実際には非UIスレッドからUI要素にアクセスすることはできません. ただし、 UI スレッドでデリゲート インスタンスを呼び出すControl.Invokeまたはのようなものを使用できます。Dispatcher.Invokeつまり、基本的には、「コードを実行する必要がありますが、正しいスレッドで実行したいので、実行してください」と言っているのです。デリゲートは、UI スレッドで実行するコードを伝える手段です。

それが役立つことを願っています。より具体的な説明を求めてください。

于 2012-10-28T07:51:56.463 に答える