2014-12-19 1 views
4

У меня есть 2 потока в моей программе. 1 обрабатывает графический интерфейс, а другой выполняет некоторую автоматизацию слов. Позволяет называть их GUIThread и WorkerThread.проверить, завершил ли поток свой метод до того, как «убил» его C#

WorkerThread выполняет цикл с использованием рекурсии. WorkerThread работает только при автоматизации слова и пользователь должен иметь возможность остановить автоматизацию слова. Поэтому я применил кнопку «Стоп» в графическом интерфейсе, которая просто убивает/завершает WorkerThread. Однако, если я убью 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 не прервет поток, а будет ждать, пока поток вернется в управляемый код.

Sameway Abort не будет делать свою работу, когда поток находится в Constrained Execution Region, наконец, блоки и т.д.

Задержки CLR поток Прерывает для кода, которая выполняется в CER.

Например: Попробуйте ввести следующий код и посмотреть, что произойдет.

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

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

Дайте нить решить, когда она будет завершена, сообщите нить, что она должна остановиться, как только сможете. Вы говорите, используя CancellationToken.

Если вы указали в Google для Thread.Abort Evil, вы найдете много полезных ресурсов, Here is one.