[스크랩] C# 2.0 에서 DataGridview 로 멀티스레드 검색
소스에 query, GridWorkList 선언부가 없어서 전체적으로 이해하지 못했지만,
데이터바인딩 시키는 부분을 쓰레드로 따로 처리하고 싶으시다 이걸로 생각되는데요,
쓰레드는 두가지 일을 동시에 하는 작업이라서 위와같이 메인쓰레드의 GridWorkList를
건드릴 경우 하나의 쓰레드가 다른 쓰레드의 작업을 방해할 수 있기 때문에
기본적으로 데이터바인딩 작업을 메인쓰레드에서 하시고, 님께서 쓰레드를 이용하여
동시에 하고자 하는 다른 작업을 별도의 쓰레드에서 하시는 것이 좋을 것 같습니다.
위와 같은 방식으로 하고자 하면 해당 바인딩 작업을 비동기식으로 처리하시는게 좋구요
DataGrid에서 BeginInvoke라는 메쏘드를 이용하여 다음과 같이 해보세요.
1. 델리게이트 선언
먼저 클래스 선언부에 델리게이트를 다음과 같이 선언하시구요..
모양은 님께서 필요하실데로 바꾸실 수 있지만 파라미터는 일단 두개로 해놨습니다.
public delegate void controlHandler(object Value, object Value2);
2. 핸들레 메쏘드 작성
두번째로 핸들러 메쏘드를 다음과 같은 형식으로 해주세요.
private void BindingHandler(object data1, object data2)
{
// 새로 생성된 쓰레드에서 작업할 내용
// 여기서 DataGrid 바인딩 작업을 함
}
3. 쓰레드로 작업을 시작할 함수 작성
쓰레드에서 호출할 메쏘드명이 list라 하면
private void list()
{
dataGrid1.BeginInvoke(new controlHandler(BindingHandler), new object[] {null, null});
}
이런식으로 코딩해주세요.
dataGrid1은 바인딩할 데이터그리드컨트롤이고 해당 컨트롤은 비동기식으로 실행하는
BeginInvoke메쏘드가 있습니다. 인수는 델리게이트와 파라미터를 요구하구요.
여기서는 직접적으로 파라미터는 필요없으니 null로 채웠습니다.
4. 쓰레드 시작
마지막으로 쓰레드를 생성하여 실행하고자 하는 곳에
Thread Workstart = new Thread(new ThreadStart(list));
Workstart.Priority = ThreadPriority.Lowest;
Workstart.IsBackground = true;
Workstart.Start();
를 코딩하여 쓰레드를 시작하시면 되겠습니다.
새로운 쓰레드의 우선순위를 정해주시고 IsBackgound를 true로 주시면,
메인쓰레드에 백그라운드로 실행되는 쓰레드이니,
메인이 종료되면 해당 쓰레드도 자동종료될겁니다.
가끔 쓰레드를 쓰다보면 메인쓰레드가 종료되어도 혼자서 남아있는 경우도 있거든요.
좀 복잡하시죠.
그러나 쓰레드를 제대로 쓰려면 이 정도의 노력은 감수하셔야 합니다.
정리해드리면,
1. 새로운 쓰레드에서 컨트롤을 마구 사용하면 안된다.
2. 해당 컨트롤 사용을 비동기식처리 메쏘드를 사용해야 한다.
3. 비동기식으로 처리하는 메쏘드는 델리게이트를 인수로 요구한다.
4. 델리게이트를 만들고 실행할 메쏘드를 만든다.
5. 새로운 쓰레드에서 컨트롤을 비동기식으로 실행한다.
혹 이해안가시거나 잘 안되면 쪽지주세요.