C\#다 중 스 레 드 제어 상세 설명
프로젝트 1:
스 레 드 제어 방법 을 호출 합 니 다.시작:Thread.Start();정지:Thread.Abort();일시 정지:Thread.Suspend();계속:Thread.Resume();
private void btn_Start_Click(object sender, EventArgs e)
{
mThread.Start(); //
}
private void btn_Stop_Click(object sender, EventArgs e)
{
mThread.Abort(); //
}
private void btn_Suspend_Click(object sender, EventArgs e)
{
mThread.Suspend(); //
}
private void btn_Resume_Click(object sender, EventArgs e)
{
mThread.Resume(); //
}
스 레 드 정의:
mThread = new Thread(() =>
{
try
{
for (int j = 0; j < 20; j++)
{
int vSum = 0;
this.textBox1.Text += "--->";
for (int i = 0; i < 100000000; i++)
{
if (i % 2 == 0)
{
vSum += i;
}
else
{
vSum -= i;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r
", DateTime.Now.ToString(), vSum);
Thread.Sleep(1000);
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
}
});
주의해 야 할 것 은 Thread.Abort()를 통 해 멈 춘 스 레 드(또는 자체 실행 이 끝 난 스 레 드)를 통 해 Thread.Start()방법 으로 다시 시작 할 수 없습니다.스 레 드 를 다시 만들어 서 시작 해 야 합 니 다.따라서'시작 버튼'사건 은 다음 과 같 아야 합 니 다.
private void btn_Start_Click(object sender, EventArgs e)
{
//
mThread = new Thread(() => // Lambda
{
try
{
for (int j = 0; j < 20; j++)
{
int vSum = 0;
this.textBox1.Text += "--->";
for (int i = 0; i < 100000000; i++)
{
if (i % 2 == 0)
{
vSum += i;
}
else
{
vSum -= i;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r
", DateTime.Now.ToString(), vSum);
Thread.Sleep(1000);
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
}
});
mThread.Start(); //
}
또한,Thread.Suspend()와 Thread.Resume()방법 에 대해 마이크로소프트 는 이 를 시대 에 뒤떨어 진 것 으로 표시 했다.Thread.Suspend has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202(Thread.Suspend 는 이미 부결 되 었 다.모니터,상호 배척 체,이벤트 와 신 호 량 등 시스템 의 다른 스 레 드 를 사용 하여 동기 스 레 드 나 자원 을 보호 하 십시오http://go.microsoft.com/fwlink/?linkid=14202 )
현재 스 레 드 가 걸 렸 을 때 어떤 코드 를 실행 하고 있 는 지 판단 할 수 없 기 때문이다.보안 권한 평가 기간 에 잠 금 이 있 는 스 레 드 를 걸 면 AppDoamin 의 다른 스 레 드 가 막 힐 수 있 습 니 다.온라인 프로그램 이 구조 함 수 를 실행 할 때 걸 면 AppDomain 에서 이러한 종류의 다른 스 레 드 를 사용 하려 고 시도 하 는 것 이 막 힐 것 입 니 다.이렇게 하면 자물쇠 가 생기 기 쉽다.
프로젝트 2:
스 레 드 가 실행 되 는 과정 에서 적당 한 위치(예 를 들 어 완전한 기능/명령 후)가 스 레 드 를 계속 할 지 여 부 를 판단 하고 스 레 드 의 운명 을 결정 합 니 다.
1.전역 변 수 를 정의 합 니 다:
int mTdFlag = 0; // 1: ;2: ;3:
2.판단 방법 을 정의 합 니 다.
bool WaitForContinue()
{
if (this.mTdFlag == 3)
{
return false; // false,
}
else if (this.mTdFlag == 2)
{
while (mTdFlag != 1)
{
Thread.Sleep(200); // ; ,
if (this.mTdFlag == 3)
{
return false; // false,
}
}
}
return true; // true,
}
3.제어 명령 이벤트 수정:
private void btn_Stop_Click(object sender, EventArgs e)
{
this.mTdFlag = 3;
//mThread.Abort(); //
}
private void btn_Suspend_Click(object sender, EventArgs e)
{
this.mTdFlag = 2;
//mThread.Suspend(); //
}
private void btn_Resume_Click(object sender, EventArgs e)
{
this.mTdFlag = 1;
//mThread.Resume(); //
}
4.스 레 드 운행 과정 에서 적당 한 위치 에서 스 레 드 가 계속 되 는 지 판단 합 니 다.
mThread = new Thread(() =>
{
try
{
for (int j = 0; j < 20; j++)
{
int vSum = 0;
this.textBox1.Text += "--->";
for (int i = 0; i < 100000000; i++)
{
if (i % 2 == 0)
{
vSum += i;
}
else
{
vSum -= i;
}
if (i % 10000000 == 0)
{
this.textBox1.Text += ".";
}
if (!WaitForContinue()) // false ,
{
break;
//return;
}
}
this.textBox1.Text += string.Format("{0} => vSum = {1}\r
", DateTime.Now.ToString(), vSum);
if (!WaitForContinue()) // false ,
{
break;
// return;
}
Thread.Sleep(1000);
}
}
catch (ThreadAbortException ex)
{
Console.WriteLine("ThreadAbortException:{0}", ex.Message);
this.textBox1.Text += ex.Message + "...";
}
finally
{
this.textBox1.Text += " ";
}
});
창 에서 크로스 스 레 드 접근 문 제 를 해결 합 니 다:창 구조 함수 에 코드 를 추가 합 니 다: Control.CheckForIllegalCrossThreadCalls = false;
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
WebView2를 Visual Studio 2017 Express에서 사용할 수 있을 때까지Evergreen .Net Framework SDK 4.8 VisualStudio2017에서 NuGet을 사용하기 때문에 패키지 관리 방법을 packages.config 대신 PackageReference를 사용해야...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.