기본적으로 하나의 응용프로그램은 하나의 단일 스레드로 구성되어 있기 때문에
for문이나 whlie같은 반복문의 처리가 길어질 경우 사용자는 다른 작업을 진행 할 수 없다.
그래서 스레드를 추가로 생성하여 위와 같은 긴 시간이 소요되는 작업들을 분리하여 처리하면 된다.
스레드를 생성하는 것은 매우 쉬운데 예를 들어 버튼 클릭에 스레드 생성 이벤트를 주면
using System.Threading;
private void button_click(object sender, EventArgs e)
{
// 생성자안의 SearchThread는 사용자가 스레드로 처리할 함수 이름
Thread mThread = new Thread(SearchThread);
mThread.Start();
}
private void SearchThread()
{
함수의 내용 정의..
}
위와 같이 쉽게 스레드를 생성하여 사용할 수 있다.
-----------------------------------------------------------------------------------------------------
주의 할 점은 스레드로 실행되는 함수내에서 폼의 컨트롤들(버튼이나, 콤보박스 등)의 속성(Value, 위치, Index)을 변경
하려고 하면 Cross Thread오류가 나게 된다.. 서로다른 스레드에서 UI를 호출 할 수 없다. 그래서 대리자를 사용한
Invoke를 사용하여 별도의 함수에서 처리하도록 한다.
using System.Threading;
// 함수의 대리자. 호출될 함수와 반환타입과 파라메터 타입/개수가 같아야한다
private delegate void UpdateCbBox(int nIndex);
private void UpdateCbBox1(int nIndex) // 실제 호출할 함수
{
comboBox1.SeletedIndex = nIndex;
}
private void button_click(object sender, EventArgs e)
{
// 생성자안의 SearchThread는 사용자가 스레드로 처리할 함수 이름
Thread mThread = new Thread(SearchThread);
mThread.Start(); // 스레드 시작
}
private void SearchThread()
{
함수의 내용 정의..
this.Invoke(new UpdateCbBox(UpdateCbBox1), new object[] {1}); // {1}은 함수에 넘길 파라메터 값
}
위와같이 invoke를 하게되면 다른 스레드에서 UI의 상태를 변경할 수 있다.
스레드 생성자에는 인수를 넘길수 없다
private void SearchThread(int a) 이런식으로 사용할 수 없다.
스레드를 생성할때 인수를 넘기려면 스레드를 컨트롤로 구성한 BackGroundWorker의 사용법을 찾아보기 바랍니다.
[출처] 스레드 생성과 invoke를 사용한 대리자 함수호출|작성자 만쥬
[C#] 세가지 Timer 와 그 차이점 (0) | 2018.06.05 |
---|---|
VS2008 Project Error (0) | 2017.11.01 |
Receive Thread 데이터 처리 및 이벤트 생성 (0) | 2017.09.20 |
C# JSON 형식으로 전송 데이터 만들기 (0) | 2017.09.20 |
C# HTTP POST방식 JSON전송 (0) | 2017.09.20 |