1. 程式人生 > >2 Task中的延續和7種阻塞

2 Task中的延續和7種阻塞

1.wait

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延續和7種阻塞
            //阻塞 wait  有點像thread的join 作用是Task執行完 這個wait之後的程式碼才可以執行
            Task t1 = new Task(()=> {
                Thread.Sleep(
1000); Console.WriteLine("我是wait"); }); t1.Start(); t1.Wait(); Console.WriteLine("我是主執行緒"); Console.ReadKey(); } } }

2.WaitAll

using System;
using System.Threading;
using System.Threading.Tasks;

namespace
多執行緒_List { class Program { static void Main(string[] args) { //Task中的延續和7種阻塞 Task t1 = new Task(()=> { Thread.Sleep(1000); Console.WriteLine("我是wait1"); }); t1.Start(); Task t2 = new Task(() => { Thread.Sleep(
200); Console.WriteLine("我是wait2"); }); t2.Start(); Task.WaitAll(t1, t2); Console.WriteLine("我是主執行緒"); Console.ReadKey(); } } }

先輸出  我是wait2 再輸出 我是wait1  最後輸出 我是主執行緒

3.WaitAny

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延續和7種阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();

            Task.WaitAny(t1, t2);
            Console.WriteLine("我是主執行緒");
            Console.ReadKey();

        }
        
    }
}

先輸出  我是wait2 再輸出 我是主執行緒  最後輸出 我是wait1 

4 whenAll +延續

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延續和7種阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();

            Task.WhenAll(t2, t1).ContinueWith(t3=> {
                Console.WriteLine("我是t3,一個新的執行緒");
            });
            Console.WriteLine("我是主執行緒");
            Console.ReadKey();

        }
        
    }
}

我是主執行緒

我是wait2
我是wait1
我是t3,一個新的執行緒

5 whenAny +延續

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延續和7種阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //跟上一個程式碼的區別是  上一個是whenAll 這個是whenAny
            Task.WhenAny(t2, t1).ContinueWith(t3=> {
                Console.WriteLine("我是t3,一個新的執行緒");
            });
            Console.WriteLine("我是主執行緒");
            Console.ReadKey();

        }
        
    }
}

我是主執行緒
我是wait2
我是t3,一個新的執行緒
我是wait1

6 Task.Factory的whenAll阻塞和延續

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延續和7種阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //注意的是 這裡是factory  上面兩個執行緒也要start
            Task.Factory.ContinueWhenAll(new Task[2] { t1, t2 }, t =>
            {
                Console.WriteLine("factory 中的when All");
            });
            Console.WriteLine("我是主執行緒");
            Console.ReadKey();

        }
        
    }
}

我是主執行緒
我是wait2
我是wait1
factory 中的when All

7 Task.Factory的whenAny阻塞和延續

using System;
using System.Threading;
using System.Threading.Tasks;

namespace 多執行緒_List
{
    class Program
    {
        static void Main(string[] args)
        {
            //Task中的延續和7種阻塞
            Task t1 = new Task(()=> {
                Thread.Sleep(1000);
                Console.WriteLine("我是wait1");
            });
            t1.Start();

            Task t2 = new Task(() => {
                Thread.Sleep(200);
                Console.WriteLine("我是wait2");
            });
            t2.Start();
            //注意的是 這裡是factory  上面兩個執行緒也要start
            Task.Factory.ContinueWhenAny(new Task[2] { t1, t2 }, t =>
            {
                Console.WriteLine("factory 中的when Any");
            });
            Console.WriteLine("我是主執行緒");
            Console.ReadKey();

        }
        
    }
}

我是主執行緒
我是wait2
factory 中的when Any
我是wait1