任务执行去哪里了?
Where does Task Execution go?
根据以下代码,我的预期是控制台会发出
- 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";
});
使用其中一个构造函数创建一个新的 Task
会返回一个 "Cold Task"。这意味着任务尚未开始。由于您从未启动过该任务,因此看不到预期的输出。
您需要调用 Task.Start
来启动它。为了return一个"Hot Task"(Started Task),你需要使用Task.Factory.StartNew
或Task.Run
.
以下应该有效:
public static Task<string> SayHelloTask()
{
Thread.Sleep(2000);
Console.WriteLine("SayHelloTaskCalled");
return Task.Run(() => {
Console.WriteLine("Task Executing");
return "SayHelloAfterSleepTask";
});
}
如果您希望您的任务是 "Cold Task" 本身,请按以下方式修改您的调用代码。
static void Main(string[] args)
{
var task2 = SayHelloTask();
task2.Start();//<--Start a "Cold task"
var result = task2.Result;
Console.WriteLine(result);
}
根据以下代码,我的预期是控制台会发出
- 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";
});
使用其中一个构造函数创建一个新的 Task
会返回一个 "Cold Task"。这意味着任务尚未开始。由于您从未启动过该任务,因此看不到预期的输出。
您需要调用 Task.Start
来启动它。为了return一个"Hot Task"(Started Task),你需要使用Task.Factory.StartNew
或Task.Run
.
以下应该有效:
public static Task<string> SayHelloTask()
{
Thread.Sleep(2000);
Console.WriteLine("SayHelloTaskCalled");
return Task.Run(() => {
Console.WriteLine("Task Executing");
return "SayHelloAfterSleepTask";
});
}
如果您希望您的任务是 "Cold Task" 本身,请按以下方式修改您的调用代码。
static void Main(string[] args)
{
var task2 = SayHelloTask();
task2.Start();//<--Start a "Cold task"
var result = task2.Result;
Console.WriteLine(result);
}