2010-06-03 4 views
2

Я пытаюсь создать поток для выполнения задачи DoWork, которая занимает менее 3 секунд. Внутри DoWork это займет 15 секунд. Я хочу прервать DoWork и передать управление обратно в основной поток. Я скопировал код следующим образом и не работал. Вместо того, чтобы прервать DoWork, он по-прежнему завершает DoWork, а затем передает управление обратно в основной поток. Что я делаю не так?.NET 1.0 ThreadPool Вопрос

class Class1 
{ 
    /// <summary> 
    /// The main entry point for the application. 
    /// </summary> 
    /// 

    private static System.Threading.ManualResetEvent[] resetEvents; 

    [STAThread] 
    static void Main(string[] args) 
    { 
     resetEvents = new ManualResetEvent[1]; 

     int i = 0; 

     resetEvents[i] = new ManualResetEvent(false); 
     ThreadPool.QueueUserWorkItem(new WaitCallback(DoWork),(object)i); 


     Thread.CurrentThread.Name = "main thread"; 

     Console.WriteLine("[{0}] waiting in the main method", Thread.CurrentThread.Name); 

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


     //abort dowork method if it takes more than 3 seconds 
     //and transfer control to the main thread. 
     do 
     { 
      if (span.Seconds < 3) 
       WaitHandle.WaitAll(resetEvents); 
      else 
       resetEvents[0].Set(); 


      end = DateTime.Now; 
      span = end.Subtract(start); 
     }while (span.Seconds < 2); 



     Console.WriteLine(span.Seconds); 


     Console.WriteLine("[{0}] all done in the main method",Thread.CurrentThread.Name); 

     Console.ReadLine(); 
    } 

    static void DoWork(object o) 
    { 
     int index = (int)o; 

     Thread.CurrentThread.Name = "do work thread"; 

     //simulate heavy duty work. 
     Thread.Sleep(15000); 

     //work is done.. 
     resetEvents[index].Set(); 

     Console.WriteLine("[{0}] do work finished",Thread.CurrentThread.Name); 
    } 
} 
+0

Если вы действительно используете VS2002, то одна вещь, которую вы делаете неправильно, - это использование восьмилетнего программного обеспечения. Почему вы не используете .NET 1.1 SP1? –

+0

Его не до меня, какая версия .net используется. –

ответ

1

Все pooled threads являются фоновыми потоками, что означает, что они автоматически завершаются, когда конец (ы) переднего плана приложения завершаются.

Я изменил вашу петлю и удалил resetEvents.

 //abort dowork method if it takes more than 3 seconds 
    //and transfer control to the main thread. 
    bool keepwaiting = true; 
    while (keepwaiting) 
    { 
     if (span.Seconds > 3) 
     { 
      keepwaiting = false; 
     } 

     end = DateTime.Now; 
     span = end.Subtract(start); 
    } 
0

[STAThread] Однокомнатная квартира. Попробуйте [MTAThread], который представляет собой многопоточную квартиру.

+0

Я пробовал [MTAThread], это не сработало. Я до сих пор не могу прервать метод DoWork. –

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