Thread.Sleep'中断'任务

时间:2011-11-30 07:46:08

标签: multithreading c#-4.0 .net-4.0 task thread-sleep

所以我有以下代码

 Action d = () =>
                {                                                             
                   for (int i = 0; i <= 10; i++)
                   {
                      Thread.Sleep(50);
                      Console.WriteLine("Task: {0} log:{1}",Thread.CurrentThread.ManagedThreadId,i);
                   }
                };
 Task.Factory.StartNew(d);

然而它不能输出任何东西。但是,如果我评论Thread.Sleep,它会按预期工作。使用不同的睡眠值会根据值获得或多或少的结果。

为什么会这样?

3 个答案:

答案 0 :(得分:3)

我怀疑你的程序在任务有机会运行之前就已退出。

默认情况下,任务在线程池线程上运行,后者是后台线程。这意味着您的程序在退出之前不会等待它们完成。

尝试在主线程上添加:

var task = Task.Factory.StartNew( d );
task.Wait();

答案 1 :(得分:3)

您是否在等待任务在任何地方完成,或者您的程序在任务完成之前是否已退出?

Task task = Task.Factory.StartNew(d);
task.Wait();

答案 2 :(得分:0)

我只是运行你的代码并输出:

Task: 10 log:0
Task: 10 log:1
Task: 10 log:2
Task: 10 log:3
Task: 10 log:4
Task: 10 log:5
Task: 10 log:6
Task: 10 log:7
Task: 10 log:8
Task: 10 log:9
Task: 10 log:10

以下是基于我运行的代码应用程序的控制台代码:

using System.Threading;
using System.Threading.Tasks;

namespace ConsoleApplication1
{
  class Program
  {
    static void Main(string[] args)
    {
      Action d = () =>
      {
        for (int i = 0; i <= 10; i++)
        {
          Thread.Sleep(50);
          Console.WriteLine("Task: {0} log:{1}", Thread.CurrentThread.ManagedThreadId, i);
        }
      };
      Task.Factory.StartNew(d);
      Console.ReadLine();
    }
  }
}