상세 컨텐츠

본문 제목

멀티 스레드.. 정리..

C#

by 탑~! 2013. 5. 25. 11:01

본문

메세지큐에 모든 동작 상태들을 담게 된다.
그리고 그 내용을 메인 스레드에서 실제로 작업 해도 담당하게 된다.

하지만 여기서 다른 스레드와의 동기 여부가 문제가 되며,
다른 스레드에서는 메인스레드에서 생성된 인스턴스된 객체들에 바로 제어를 하지 못한다.

그래서 다른 스레드에서 하는 작업을 메세지 큐에 집어 넣고 메인 스레드가 작업은 해야 한다.
그렇기 때문에 여기서 나오는 내용들이 
Invoke, BeginInvoke 가 나오게 된다. 

Invoke 해당 내용이 업데이트 될때까지 기다렸다가 다음 행을 시작하게 되며,
BeginInvoke 비동기 적으로 바로 다음 행으로 진행이 되며, 나중에 업데이트가 되게 된다.

...

메인 스레드에게 이러한 작업을 실행해라 하고 다른 스레드에서 위임을 시켜 줘야 한다.

//핸들러 설정
public delegate void UpdateUIHandler(DataSet _dsTmp);

public void GetTable()
{
   Console.Write(...);
   string SQLCommentText = ...
   ....
   Thread.Sleep(1000 * 5);

   //TargetGrid가 태어난 스레드에서 실행을 하게 된다.
   TargetGrid.Invoke(new UpdateUIHandler(UpdateUI), new object[] {_dsTmp});
}

public void UpdateUI(DataSet _dsTmp)
{
   TargetGrid.DataSource = _dsTmp.Tables[0];
}

실행을 하게 되면
내가 다르게 만든 스레드에서 UpdateUI를 하게 되지만 UpdateUI는 메인 스레드에서 
작업 하게 된다.

윈도우 어플리케이션에서는 스레드를 사용하지만 다른 스레드에서 사용하지 않고
메인 스레드로 위임 해서 꼭 사용해야 한다. 
이럴때 사용하는게 Invoke()가 된다.

BeginInvoke를 Invoke를 사용하게 되면 
다음 행은 바로 실행 되고, UpdateUI를 실행하는 스레드는 따로 진행하게 된다.



출처 : http://www.iamgsi.com/entry/%EB%A9%80%ED%8B%B0-%EC%8A%A4%EB%A0%88%EB%93%9C-%EC%A0%95%EB%A6%AC

관련글 더보기