반응형
* 크로스 스레드
- 자신의 스레드가 아닌 다른 스레드가 그 컨트롤에 접근했었을 때 발생하는 오류
* 해결 방법
Form1.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
namespace CrossThread
{
public partial class Form1 : Form
{
/*
스레드의 동작을 제어하는 메서드
Abort():강제 종료
Interrupt():대기 중인 스레드를 중단
Join(): 스레드가 종료될 때까지 호출 스레드를 차단
Sleep(int millisecondsTimeout): 지정된 시간(밀리초)동안 스레드를 중지
Start(): 스레드 시작
Suspend(): 일시 중지
Resume(): 일시 중지된 스레드 수행
*/
Thread thMain;
bool bThread = false;
//스레드 최초 한번 실행...
bool bThreadStart = false;
#region 3번째 방법...
//3번째 방법 델리게이트 선언...
delegate void TextBoxDelegate(string strText);
//3번째 방법 델리게이트를 위한 함수 선언...
private void TextBoxFunc(string strText)
{
txtThread.Text = strText;
}
#endregion
public Form1()
{
InitializeComponent();
//1. 첫번째 해결 방법
//CheckForIllegalCrossThreadCalls = false ;
thMain = new Thread(new ThreadStart(Thread_Timer));
thMain.IsBackground = true; //스레드를 백그라운드로 지정...
//기본 : 포어그라운드 차이점 => 프로그램 종료시 백그라운드 스레드는 하던일 멈추고 같이 종료...
// 포어그라운드 스레드는 하던일 다 하고 나면 종료...
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
//스레드 종료...
if (thMain != null)
{
if (bThreadStart)
{
thMain.Abort(); //강제 종료...
}
else
{
thMain.Interrupt(); //대기중인 스레드 종료...
}
thMain = null;
}
}
//버튼 이벤트...
private void button1_Click(object sender, EventArgs e)
{
//최초 한번만 실행...
if (!bThreadStart)
{
bThread = true;
bThreadStart = true;
thMain.Start();
}
//일시정지...
else
{
bThread = true;
thMain.Resume ();
}
}
private void button2_Click(object sender, EventArgs e)
{
if(bThreadStart)
{
bThread = false;
//일시 정지 된 스레드 다시 실행...
thMain.Suspend ();
}
}
void Thread_Timer()
{
while (bThread)
{
try
{
//크로스 스레드 오류 내기...
//txtThread.Text = "크로스 스레드 예제...";
//2번째 방법...
/*
if (txtThread.InvokeRequired == true)
{
//다른 스래드이다...
this.Invoke(new Action(delegate()
{
txtThread.Text = "크로스 스레드 예제...";
}));
}
else
{
//같은 스래드이다...
txtThread.Text = "크로스 스레드 예제...";
}
*/
//3번째 방법으로 사용 예제
this.Invoke(new TextBoxDelegate(TextBoxFunc), "크로스 스레드 예제...");
}
catch (Exception ex)
{
MessageBox.Show("오류 : " + ex.Message.ToString());
}
Thread.Sleep(1000);
}
}
}
}
위 소스 예제를 보시는 바와 같이 1,2,3 번째 방법 으로 예제를 만들어 보았습니다.
* 요약
[C#] 델리 게이트 (Delegate) - 1 델리게이트란? , 선언 방법과 간단한 예제
[C#] 델리 게이트 (Delegate) - 2 델리게이트 콜백과 사용 그리고 체인
반응형
'C# Programming' 카테고리의 다른 글
[C#] 객체 파일 저장 및 불러오기 예제 (Serialization) (0) | 2019.09.19 |
---|---|
[C#] 구조체 를 바이트 배열로 또는 바이트 배열을 구조체로 변환 (0) | 2019.09.18 |
[C#] 인덱서 (Indexer) (0) | 2019.09.14 |
[C#] 델리 게이트 (Delegate) - 2 델리게이트 콜백과 사용 그리고 체인 (0) | 2019.09.12 |
[C#] 델리 게이트 (Delegate) - 1 델리게이트란? , 선언 방법과 간단한 예제 (0) | 2019.09.11 |