Использование логической переменной Cross Thread для прерывания потока - PullRequest
0 голосов
/ 25 марта 2010

Допустим, у нас есть этот код:

bool KeepGoing = true;
DataInThread = new Thread(new ThreadStart(DataInThreadMethod));
DataInThread.Start();
//bla bla time goes on
KeepGoing = false;

private void DataInThreadMethod()
{
      while (KeepGoing)
      {
         //Do stuff
      }
   }
}

Теперь идея состоит в том, что использование логического значения - это безопасный способ завершить поток, потому что это логическое значение существует в вызывающем потоке, вызывает ли это какую-либо проблему?

Это логическое значение используется только в вызывающем потоке для остановки потока, поэтому его нельзя использовать в другом месте

Ответы [ 2 ]

2 голосов
/ 25 марта 2010

Вам необходимо уточнить точно что / где KeepGoing, но нет;это не безопасно.Его можно хранить в реестре на x86 (но это маловероятно в большинстве нетривиальных примеров).Вам нужно сделать это volatile или синхронизировать (lock и т. Д.) Доступ к нему.Например, см. Здесь .

0 голосов
/ 26 марта 2010

Надеюсь, я не буду касаться этого ответа, но:

Jon's Worker class пример имеет альтернативу тому, что вы делаете, которая является поточно-ориентированной. Две проблемы, которые я обнаружил при использовании подхода while(boolVariable), заключаются в том, что некоторые задачи занимают больше времени, чем другие (при условии, что вы выполняете более одной задачи), а это означает, что останов не выполняется до конца этой задачи. Другой, что происходит, когда вы добираетесь до конца цикла? Возможно, прервите или просто повторите эту задачу навсегда, а это не всегда то, что вам нужно, например, если вы загружаете список файлов.

...