最近研究多线程,感觉Task的返回值很要,特别是ContinueWith或者是使用task.WhenAll或者task.WhenAny的时候,需要确定到底会出现什么样的结果。在网上看了很多人写的文章,感觉参杂的信息太多,所以写了这篇简单的只讲task返回值的文章,尽量减少其他元素的干扰。
本文内容都是通过单元测试实践得到(visual studio2013上应用了ReSharper)的结果,不是猜想的。
一、task直接返回值
1.定义一个返回int类型的普通方法,定义一个Task调用这个方法
int DoOnFirst()
{
Console.WriteLine("doing some task {0}", Task.CurrentId);
Thread.Sleep(3000);
return 11;
}
[TestMethod]
public void TestMethod1()
{
//Task<int> t1 = new Task(()=>DoOnFirst);
//t1.Start();
Task<int> t1 = Task.Factory.StartNew(() =>
{
return DoOnFirst();
});
t1.Wait();
var a1 = t1.Result;
}
结果输出11
2.调用的方法无返回值
创建一个无返回值的方法
//action的模式
void DoOnSecond()
{
Console.WriteLine("do some cleanup 22");
//Thread.Sleep(3000);
//return 22;
}
调用无返回值的的方法
[TestMethod]
public void TestMethod2()
{
Task t2 = Task.Factory.StartNew(() =>
{
//由于DoOnSecond没有返回值,所以不能用return返回
// return DoOnSecond();
DoOnSecond();
});
t2.Wait();
// var a2 = t2.Result;//因为DoOnSecond方法没有返回值,所以t2没有result
Console.WriteLine("结果: