首页 > 代码库 > 关于Task的认识
关于Task的认识
首先来说说 Task.Factory.StartNew这种方式来创建Task,这里的WaitAll()指的是等待所有Task执行完成,并且里面的Task参数(t1,t2)是异步的,先以匿名委托方式
static void Main(string[] args) { Task t1 = Task.Factory.StartNew(delegate { MyMethodA(); }); Task t2 = Task.Factory.StartNew(delegate { MyMethodB(); }); Task.WaitAll(t1, t2); Console.ReadKey(); Console.ReadKey(); } private static void MyMethodA() { Thread.Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine("A"); } private static void MyMethodB() { Console.WriteLine("B"); }
其运行结果是
B
A
再看看以传参函数形式来看,并以拉姆达表达式来进行
static void Main(string[] args) { Task<string> t1 = Task<string>.Factory.StartNew(()=> MyMethodA("AAAAA") ); Task t2 = Task.Factory.StartNew(()=> MyMethodB()); Task.WaitAll(t1, t2); Console.WriteLine("第二次输入" + t1.Result); Console.ReadKey(); Console.ReadKey(); } private static string MyMethodA(string value) { Thread.Sleep(TimeSpan.FromSeconds(0.5)); Console.WriteLine(value); return value; } private static void MyMethodB() { Console.WriteLine("B"); }
因MyMethodA()里面将task线程挂起了,所以先输出了B,也证明了Task的异步!
使用New Task创建TASK
、最简单的构造Task的方式为使用lambda表达式:
[csharp] view plain copy print?
- Task<int> task = new Task<int>(() => TaskMethod("Task 1"));
- task.Start();
- int result = task.Result;
- Console.WriteLine("Result is: {0}", result);
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
[csharp] view plain copy print?
- Task<int> task = CreateTask("Task 2");
- task.RunSynchronously(); //运行在主线程中,等同于直接运行: TaskMethod("Task 2");
- int result = task.Result;
- Console.WriteLine("Result is: {0}", result);
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的运行状态
[csharp] view plain copy print?
- Task<int> task = CreateTask("Task 3");
- Console.WriteLine(task.Status);
- task.Start();
- while (!task.IsCompleted)
- {
- Console.WriteLine(task.Status);
- Thread.Sleep(TimeSpan.FromSeconds(0.5));
- }
- Console.WriteLine(task.Status);
- int result = task.Result;
- Console.WriteLine("Result is: {0}", result);
Task<int> task = CreateTask("Task 3");Console.WriteLine(task.Status);task.Start();while (!task.IsCompleted){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结果。
关于Task的认识
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。