매개 변수
method

args 매개 변수에 있는 매개 변수의 수 및 형식과 동일한 매개 변수를 갖는 메서드의 대리자입니다.

args

지정된 메서드에 인수로 전달하는 개체의 배열입니다. 메서드가 인수를 사용하지 않으면 이 매개 변수는 Null 참조(Visual Basic의 경우 Nothing)이 될 수 있습니다.

반환 값

호출되는 대리자의 반환 값이 들어 있는 Object이거나, 대리자에 반환 값이 없으면 Null 참조(Visual Basic의 경우 Nothing)입니다.

설명

대리자는 C 또는 C++ 언어의 함수 포인터와 유사합니다. 대리자는 대리자 개체 안에서 메서드에 대한 참조를 캡슐화합니다. 이 대리자 개체는 참조된 메서드를 호출하는 코드로 전달될 수 있으며 컴파일 타임에는 호출될 메서드를 알 수 없습니다. C 또는 C++의 함수 포인터와 달리 대리자는 개체 지향적이고 형식이 보다 안전합니다.

컨트롤의 핸들이 없으면 이 메서드는 창 핸들이 있는 컨트롤이나 폼을 찾을 때까지 해당 컨트롤의 부모 체인을 위로 검색합니다. 적절한 핸들을 찾을 수 없으면 이 메서드는 예외를 throw합니다. 호출자에 호출을 콜백하는 동안 발생하는 예외입니다.

참고

컨트롤에는 InvokeRequired 속성과 함께 스레드로부터 안전한 네 개의 메서드(Invoke, BeginInvoke, EndInvoke, CreateGraphics)가 있습니다. 다른 스레드에서 메서드를 호출하는 경우 이러한 호출 메서드 중 하나를 사용하여 컨트롤의 스레드에 대한 호출을 마샬링해야 합니다.

대리자는 EventHandler의 인스턴스가 될 수 있습니다. 이 경우 송신자 매개 변수가 이 컨트롤을 포함하고, 이벤트 매개 변수가 EventArgs.Empty를 포함합니다. 또한 대리자는 MethodInvoker의 인스턴스가 되거나, void 매개 변수 목록을 사용하는 다른 대리자가 될 수 있습니다. EventHandlerMethodInvoker 대리자는 다른 형식의 대리자보다 빨리 호출됩니다.

참고

메시지를 처리해야 하는 스레드가 더 이상 활성 상태가 아니면 예외가 throw될 수 있습니다.

Windows Mobile for Pocket PC, Windows Mobile for Smartphone, Windows CE 플랫폼 참고: .NET Compact Framework 응용 프로그램에서는 대리자가 EventHandler의 인스턴스여야 합니다. 예제를 보려면 대리자 샘플을 참조하십시오.

다음 코드 예제에서는 대리자가 들어 있는 컨트롤을 보여 줍니다. 대리자는 목록 상자에 항목을 추가하는 메서드를 캡슐화하고 이 메서드는 지정한 인수를 통해 폼의 내부 핸들을 소유하는 스레드에서 실행됩니다. 사용자가 단추를 클릭하면 Invoke가 대리자를 실행합니다.

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

   public class MyFormControl : Form
   {
      public delegate void AddListItem(String myString);
      public AddListItem myDelegate;
      private Button myButton;
      private Thread myThread;
      private ListBox myListBox;
      public MyFormControl()
      {
         myButton = new Button();
         myListBox = new ListBox();
         myButton.Location = new Point(72, 160);
         myButton.Size = new Size(152, 32);
         myButton.TabIndex = 1;
         myButton.Text = "Add items in list box";
         myButton.Click += new EventHandler(Button_Click);
         myListBox.Location = new Point(48, 32);
         myListBox.Name = "myListBox";
         myListBox.Size = new Size(200, 95);
         myListBox.TabIndex = 2;
         ClientSize = new Size(292, 273);
         Controls.AddRange(new Control[] {myListBox,myButton});
         Text = " 'Control_Invoke' example ";
         myDelegate = new AddListItem(AddListItemMethod);
      }
      static void Main()
      {
         MyFormControl myForm = new MyFormControl();
         myForm.ShowDialog();
      }
      public void AddListItemMethod(String myString)
      {
            myListBox.Items.Add(myString);
      }
      private void Button_Click(object sender, EventArgs e)
      {
         myThread = new Thread(new ThreadStart(ThreadFunction));
         myThread.Start();
      }
      private void ThreadFunction()
      {
         MyThreadClass myThreadClassObject  = new MyThreadClass(this);
         myThreadClassObject.Run();
      }
   }
   public class MyThreadClass
   {
      MyFormControl myFormControl1;
      public MyThreadClass(MyFormControl myForm)
      {
         myFormControl1 = myForm;
      }
      String myString;

      public void Run()
      {

         for (int i = 1; i <= 5; i++)
         {
            myString = "Step number " + i.ToString() + " executed";
            Thread.Sleep(400);
            // Execute the specified delegate on the thread that owns
            // 'myFormControl1' control's underlying window handle with
            // the specified list of arguments.
            myFormControl1.Invoke(myFormControl1.myDelegate,
                                   new Object[] {myString});
         }
      }
   }

+ Recent posts