-
C# CrossThread 오류가 발생할 때닷넷/WinForms 2017. 8. 7. 15:00반응형
스레드로 작업을 돌리는 도중 CrossThread 오류가 날 때가 있다.
그 이유는 스레드 간에 간섭이 일어났기 때문이다.
프로그램이 실행될 때 눈에 보이는 전부가 이미 스레드 하나이다. 이걸 메인스레드라 부른다.
(프로세스는 이미 스레드 하나를 가지고 있는 것임.)
그 이후에 우리가 추가적으로 작업할 때 스레드를 선언하여 사용하는데 (이하 A 스레드)
A 스레드에서 메인스레드에 있는 작업들 가령 TextBox나 ListBox 같은 컨트롤에 데이터를 입력하게 되는 경우
A 스레드에서 메인스레드로의 간섭이 일어나 CrossThread 오류가 나는 것이다.
이를 해결하려면 대리자(delegate)를 이용하면 된다.
다음은 리스트박스에 텍스트를 추가하는 델리게이트와 메소드이며
A 스레드 안에서 리스트박스에 텍스트를 추가하는 작업을 할 때는
SetText(텍스트); 만 사용하면 된다.
#region ListBox에 오류없이 지정한 텍스트 나오게delegate void SetTextCall(string text);private void SetText(string text){if (this.InvokeRequired){SetTextCall d = new SetTextCall(SetText);this.Invoke(d, new object[] { text });}else{listBox1.Items.Add(text);listBox1.SelectedIndex = listBox1.Items.Count - 1;}}#endregioncs 반응형'닷넷 > WinForms' 카테고리의 다른 글
C# 엑셀파일 가져오기 using Microsoft.Office.Interop.Excel (DataGrdiVeiw에 바인딩 포함) (8) 2018.01.10 C# DataGridView를 Database에 동기화하는 방법 (InsertCommand, UpdateCommand, DeleteCommand 사용하기) (0) 2017.10.20 C# 프로그램 실행 중복방지 (0) 2017.04.26 C# DataGridView 열 순서 (0) 2016.12.13 C# 윈폼에서 같은 컨트롤들을 한번에 제어하는 방법 (2) 2016.08.18