2016-01-02 80 views
2

基于下面的代码,我的期望是,控制台会发出任务执行去哪里?

  • SayTaskHelloCalled
  • 任务执行
  • SayHelloAfterSleepTask

但任务不运行。只有第一行发出控制台。请建议为什么?

static void Main(string[] args) 
    { 
     var task2 = SayHelloTask(); 
     var result = task2.Result; 
     Console.WriteLine(result); 
    } 

public static Task<string> SayHelloTask() 
     { 
      Thread.Sleep(2000); 
      Console.WriteLine("SayHelloTaskCalled"); 
      return new Task<string>(() => { 
       Console.WriteLine("Task Executing"); 
       return "SayHelloAfterSleepTask"; 
      }); 

回答

6

使用构造手你回来“冷任务”其一个创建新Task。这意味着该任务尚未开始。由于您从未开始任务,因此看不到预期的输出。

您需要致电Task.Start才能启动它。为了返回“热门任务”(已启动任务),您需要使用Task.Factory.StartNewTask.Run

下面应该工作:

public static Task<string> SayHelloTask() 
{ 
    Thread.Sleep(2000); 
    Console.WriteLine("SayHelloTaskCalled"); 
    return Task.Run(() => { 
     Console.WriteLine("Task Executing"); 
     return "SayHelloAfterSleepTask"; 
     }); 
} 

如果你喜欢你的工作是“冷任务”本身,然后修改如下调用代码。

static void Main(string[] args) 
{ 
    var task2 = SayHelloTask(); 
    task2.Start();//<--Start a "Cold task" 
    var result = task2.Result; 
    Console.WriteLine(result); 
} 
+0

谢谢..如果我想从调用代码开始冷任务..比方说,由于某种原因,我想调用者决定何时启动发动机需要什么样的变化:) – helloworld

+0

@helloworld更新我的答案。希望有所帮助。但我建议不要将冷任务用于公共方法。因为几乎每个.NET框架方法都返回一个Task是一个热门任务。返回冷任务会造成不必要的混淆。 –

+0

哦..它有一个开始()..漂亮简洁:)非常感谢..只是一个额外的查询..什么具体区别是有返回任务 V/S异步任务 ..因为任务已经是背景。 。我的原始查询被回答虽然..谢谢 – helloworld