【C#】44.TaskT根据带返回值的函数构造Task
上篇中,我们看了不带参数值和返回值的函数(Action)构造Task的⽅法,本篇中我们想Thread⼀样,看看如何给Task传参和返回值。
⾸先定义int TaskMethod(String)函数,该函数以String作为参数,返回Int类型结果:
static int TaskMethod(string name)
{
Console.WriteLine("Task {0} 运⾏在线程id为{1}的线程上。是否是线程池中线程?:{2}",
name, Thread.CurrentThread.ManagedThreadId, Thread.CurrentThread.IsThreadPoolThread);
Thread.Sleep(2000);
return 42;
}
static Task<int> CreateTask(string name)
{
return new Task<int>(() => TaskMethod(name));
}
⼀、最简单的构造Task的⽅式为使⽤lambda表达式:
Task<int> task = new Task<int>(() => TaskMethod("Task 1"));
task.Start();
int result = task.Result;
Console.WriteLine("Result is: {0}", result);
需要注意的是,我们构造了Task<int>任务,然后Start(),之后返回值即task. Result属性!由于Result的关系, 因此线程将等待result得到后再往下进⾏。
⼆、Task同步运⾏RunSynchronously
Task<int> task = CreateTask("Task 2");
task.RunSynchronously(); //运⾏在主线程中,等同于直接运⾏: TaskMethod("Task 2");
int result = task.Result;
Console.WriteLine("Result is: {0}", result);
这⾥没有使⽤Start()⽽是使⽤ RunSynchronously(),直接同步运⾏!等同于直接运⾏ Result = TaskMethod("Task 2");
因此,该Task不是运⾏在线程池中,⽽是运⾏在主线程中。
三、Task的运⾏状态
Task<int> task = CreateTask("Task 3");
Console.WriteLine(task.Status);
task.Start();
while (!task.IsCompleted)
writeline函数{
Console.WriteLine(task.Status);
Thread.Sleep(TimeSpan.FromSeconds(0.5));
}
Console.WriteLine(task.Status);
int result = task.Result;
Console.WriteLine("Result is: {0}", result);
上⾯的代码使⽤了状态判断(IsCompleted)轮查⽅式,输出了不同的Task状态。等到task执⾏完毕后,也就⾃然得到int结果。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论