Task7种阻塞方式

一:Task的阻塞和延续操作

1.阻塞

在Thread=>使用Join方法阻塞

Thread:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Thread t = new Thread(() =>
{
Thread.Sleep(1000);
Console.WriteLine("我是工作线程1");
});

Thread t2 = new Thread(() =>
{

Thread.Sleep(1000);
Console.WriteLine("我是工作线程2");
});
t2.Start();
t.Start();

t2.Join();
t.Join();

每等待一个,需要Join()一下,线程多了以后,就繁琐了!

Task:

1
2
3
4
5
6
7
8
9
10
11
Task task1 = new Task(()=> {
Thread.Sleep(1000);
Console.WriteLine("我是工作线程1:{0}", DateTime.Now.ToString("hh:mm:ss"));
});
task1.Start();
Task task2 = new Task(() => {
Thread.Sleep(2000);
Console.WriteLine("我是工作线程2:{0}", DateTime.Now.ToString("hh:mm:ss"));
});
task2.Start();
Task.WhenAll(task1, task2);

2.Task.WaitAll():是一种&&关系[必须其中所有的Task完成才算完成]

3.Task.WaitAny():是一种||关系[其中有一个Task完成就算完成]

4.Task.Wait()==join()

5.Task.WhenAll(task1,task2).ContinueWith();执行延续任务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Task task1 = new Task(()=> {
Thread.Sleep(1000);
Console.WriteLine("我是工作线程1:{0}", DateTime.Now.ToString("hh:mm:ss"));
});
task1.Start();
Task task2 = new Task(() => {
Thread.Sleep(2000);
Console.WriteLine("我是工作线程2:{0}", DateTime.Now.ToString("hh:mm:ss"));
});
task2.Start();
//------------------------------------上面的等待返回值都是void
Task.WhenAll(task1, task2).ContinueWith(t=> {
//执行工作线程3
Console.WriteLine("我是主线程:{0}", DateTime.Now.ToString("hh:mm:ss"));
});
Console.Read();

1572830032942

6.Task.Factory.ContinueWhenAll();

7.Task.Factory.ContinueWhenAny();