2010-08-17 140 views
0

足够简单的问题,我只需要突破一个最小的混乱墙。C#等待和多线程

因此,基于下面的简单代码:

Task task1 = new Task(() => 
      { 
       for (int i = 0; i < 500; i++) 
       { 
        Console.WriteLine("X"); 
       } 
      }); 

     task1.Start(); 
     task1.Wait(); 

     for (int j = 0; j < 500; j++) 
     { 
      Console.WriteLine("Y"); 
     } 

     Console.ReadLine(); 
  1. 因此,基于上述情况,将任务是在它自己单独的线程和主线程上的其他代码?

  2. 现在就等待而言,我很困惑,因为我正在指示等待什么。所以,回到上面的例子,假设现在任务1有工作的一个疯狂的金额做,在主线程只存在一条语句象下面这样:

    Task task1 = new Task(() => 
         { 
          //insane amount of work to do which might take a while 
         }); 
        task1.Start(); 
        task1.Wait(); 
        Console.WriteLine("HI"); 
    
        Console.ReadLine(); 
    

是等待正好挡住了线程Task1已打开?如果是这样,那么在task1完成之前,不应该允许其他线程(主线程)和WriteLine语句执行吗?还是等待说“没有线程会运行,直到我完成”?

回答

2
  1. 该任务计划在当前TaskScheduler中执行,这意味着它将运行在不同的线程中。

  2. 等待指示主线程等待,直到任务完成。

+0

啊好吧,等等总是指向主线程。我假设这意味着那么其他任务(如果我有多个任务)在其他线程上仍然可以发生上下文切换? – Ilya 2010-08-17 22:21:58

1

task1一个将运行在一个单独的线程。 task1.Wait()指示主线程等待task1完成执行。

1

等待导致调用线程等待任务完成。本质上,这段代码所做的是在两个线程之间同步运行,并且比只在一个线程上运行它没有获得诸如释放UI线程之类的任何好处花费的时间要长。