2014-12-19 2 views
4

내 프로그램에 스레드가 2 개 있습니다. 1은 GUI를 처리하고 다른 하나는 일부 단어 자동화를 수행합니다. GUIThread 및 WorkerThread를 호출 할 수 있습니다.스레드가 "죽이기"전에 메서드를 완료했는지 확인하십시오. C#

WorkerThread는 재귀를 사용하는 방법을 반복합니다. WorkerThread는 자동화라는 단어를 수행하는 동안 만 작동하며 사용자는 단어 자동화를 중지 할 수 있어야합니다. 따라서 GUI에서 "WorkerThread를 죽이거나 종료하는"Stop 버튼을 구현했습니다. 그러나 WorkerThread가 메소드의 중간에있는 동안 그것을 죽이면 가끔 내 워드 문서에 문제가 생깁니다 (이것은 더 긴 이야기입니다) 그리고 그것이 내가 WorkerThread가 끝나기 전에 메소드에서 끝났는지 확인하기를 원하는 이유입니다 그것.

//Stops the worker thread = stops word automation in process 
workerThread.Abort(); 

//This blocks the thread until the workerThread has aborted 
while (workerThread.IsAlive) ; 

문제에 대한 내 자신의 제안/해결 방법은 내가의 WorkerThread 입력 할 때마다 설정할 수있는 전역 변수를 가지고 있었고 왼쪽 :

이 내가 "정지"버튼을 쳤을 때 내 코드가하는 일입니다 방법 그러나 이것은 나에게 바르게 보이지 않는다. 나는 그것을 다루는 더 쉬운 방법이 있어야한다고 생각한다.

+2

http://msdn.microsoft.com/en-us/library/dd997364(v=vs.110).aspx --- 관리되는 스레드에서 취소 – zerkms

+1

제안 된 Zerkms 제안대로 취소 토큰 – Younes

답변

10

은 때때로 당신이 스레드를 죽일해서는 안 이유는 내 워드 문서

에 문제가 발생하는 방법의 중간에있는 동안 나는의 WorkerThread를 죽일 그러나합니다. 스레드가 무엇을하고 있었는지, 죽이는 것이 안전한지 말할 수는 없습니까?

Abort 당신이 기대하는대로하지 않습니다. documentation을보십시오, 그것은 미묘합니다 이 메서드를 호출하면 보통 스레드 종료됩니다. 항상 그렇다고하는 단어에 유의하십시오.

예, Abort은 항상 스레드를 죽이지 않습니다. 예를 들어 스레드가 관리되지 않는 코드를 실행 중이면 CLR은 스레드를 중단하지 않고 스레드가 관리되는 코드로 돌아갈 때까지 기다립니다. 스레드가 마지막으로 Constrained Execution Region

CLR을 지연 스레드가 CER에서 실행되는 코드를 중단 블록 등의 경우

SAMEWAY Abort는 일을하지 않습니다.

예 : 다음 코드를 실행하여 어떤 결과가 발생하는지보십시오.

private void IWillNeverReturn() 
{ 
    Thread thread = new Thread(() => 
    { 
     try 
     { 
     } 
     finally 
     { 
      while (true) 
      { } 
     } 
    }); 
    thread.Start(); 

    Thread.Sleep(1000); 
    thread.Abort(); 
} 

스레드가 완료되어야 할 시점을 결정하게하십시오. 스레드가 가능한 빨리 중지해야한다고 알립니다. 너는 CancellationToken을 사용하여 말한다.

이블 악의 제기의 경우, Here is one과 같은 많은 유용한 리소스를 찾을 수 있습니다.