programming/c#

[펌] 다중처리를 위하여 사용하는 비동기 구현

happy4u 2005. 3. 3. 10:23

public delegate int MyDelegate(int i, int j);  <- 아래 Add 메소드와 형정보가 같아야 한다.

private void button1_Click(object sender, System.EventArgs e) {
    int i, j;
    i = Convert.ToInt32(textBox1.Text);
    j = Convert.ToInt32(textBox2.Text);

    AsyncCallback ac = new AsyncCallback(CallEnd); <-비동기 콜백 함수 선언
    MyDelegate md = new MyDelegate(Add) <- 델리게이트 생성
    IAsyncResult ir = md.BeginInvoke(i, j, ac, md);
    MessageBox.Show("비동기 호출");

    /* 직접 호출
    int temp = md(i, j);
    MessageBox.Show(temp.ToString());
    */
}

public int Add(int i, int j) {
    System.Threading.Thread.Slepp(5000);   <- 5초가 소요되는 코드...
    return i+j;
}

public void CallEnd(IAsyncResult ar) {
    //비동기 결과 출력.
    MyDelegate md = (MyDelegate) ar.AsyncState;
    int temp = md.EndInvoke(ar);
    MessageBox.Show("결과 = "+ temp.ToString());
}

 

 

※비동기를 만들기 위해서
1. 비동기 콜백(CallBack) 함수를 만든다.
    AsyncCallback ac = new AsyncCallback(CallEnd);
2.  AsyncCallback도 델리게이트이므로 CallEnd를 선언한다.
    public void CallEnd(IAsyncResult ar) { }
3. 호출한다.
    iAsyncResult ir = md.BeginInvoke(i, j, ac, md);


"비동기 호출" 메시지 박스 출력 후 5초뒤에 "결과"가 출력된다.