2010-06-03 4 views
2

Я хотел бы вызвать высокопроизводительный метод dowork на отдельной нити и убить его, если он занимает больше 3 секунд. Есть ли какие-либо проблемы со следующим кодом?Вопрос многопоточности

class Class1 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    [STAThread] 
    static void Main(string[] args) 
    { 
     Console.WriteLine("starting new thread"); 

     Thread t = new Thread(new ThreadStart(dowork)); 
     t.Start(); 

     DateTime start = DateTime.Now; 
     TimeSpan span = DateTime.Now.Subtract(start); 

     bool wait = true; 
     while (wait == true) 
     { 
      if (span.Seconds > 3) 
      { 
       t.Abort(); 
       wait = false; 
      } 
      span = DateTime.Now.Subtract(start); 
     } 

     Console.WriteLine("ending new thread after seconds = {0}", span.Seconds); 
     Console.WriteLine("all done"); 
     Console.ReadLine(); 

    } 

    static void dowork() 
    { 

     Console.WriteLine("doing heavy work inside hello"); 
     Thread.Sleep(7000); 
     Console.WriteLine("*** finished**** doing heavy work inside hello"); 
    } 
} 

ответ

5

Если бы это было, я бы использовал Thread.Join() перегрузку, которая принимает параметр миллисекунды. (Или тот, который занимает TimeSpan.) Он чище и содержит меньше строк кода.

t.Start(); 

if (!t.Join(3000)) 
    t.Abort(); 

Или, как сказал Матти, поставить логику синхронизации внутри резьбовая процесса и иметь его самоуничтожение.

+0

Я забыл об использовании соединения с таймаутом в целом. Это лучше, чем мой «Сон», потому что он будет продолжаться через менее 3 секунд, если операция завершится раньше этого. –

-1

Я думаю, вам нужно узнать о Thread.Join(int). Он попытается присоединиться к потоку, и после указанного таймаута он выйдет, после чего вы можете позвонить Thread.Abort().

10

Это очень плохая практика программирования. Не запускайте потоки, которые вы не можете отключить. Код, который запускает поток и код, который запускает поток, должен иметь определенный механизм, с помощью которого они могут общаться. Существует много таких механизмов; например, рабочий поток может периодически запрашивать поток владельца «должен ли я продолжать?» Рабочий поток мог периодически проверять поле threadafe, в котором говорится, следует ли быстро прекратить работу. И так далее.

Если вы начинаете работу над новой нитью, и вы не знаете, что она делает или как долго она будет проходить, тогда вы играете с огнем. В частности, если этот код нити может быть враждебным и активно сопротивляется снятию. Существует нет никакой гарантии, что прерывание нитки делает что-либо вообще; если вы умны, тогда вы можете написать код, который делает потоки устойчивыми к прерываниям потоков.

Если вы в такой ситуации, что нужно сделать, это запустить код в новом процессе, а не новый нить, а затем выключить процесс когда он занимает слишком много времени ,

Смежные вопросы