매개 변수
- 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 매개 변수 목록을 사용하는 다른 대리자가 될 수 있습니다. EventHandler나 MethodInvoker 대리자는 다른 형식의 대리자보다 빨리 호출됩니다.
참고
메시지를 처리해야 하는 스레드가 더 이상 활성 상태가 아니면 예외가 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});
}
}
}
'C#.NET' 카테고리의 다른 글
[MSDN]Windows 서비스 응용 프로그램을 위한 설치 프로젝트를 만드는 방법 (0) | 2009.12.29 |
---|---|
base(C# 참조) (3) | 2009.12.29 |
app.config 읽기 (0) | 2009.12.23 |
초간단 .NET 날짜간격 구하기 (0) | 2009.12.15 |
[VS 2005,비주얼 스튜디오] 잘못된 바인딩 핸들입니다 (0) | 2009.12.15 |
[암호화,MD5,SHA1] 비밀번호 암호화 하기 (0) | 2009.12.15 |
DataGridView VirtualMode (0) | 2009.12.14 |
Windows Forms DataGridView 컨트롤에서 가상 모드 구현 (0) | 2009.12.11 |
[MSDN]제네릭 클래스(C# 프로그래밍 가이드) (0) | 2009.12.10 |
[web.Config &구성 검색] DB접속 연결자 등록해놓고 사용하기 (0) | 2009.12.08 |