1. 程式人生 > >C#多執行緒基礎,實現主子執行緒有序輸出

C#多執行緒基礎,實現主子執行緒有序輸出

建立控制檯程式

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncThread
{
    public class Program
    {
        static void Main(string[] args)
        {
            Func<int> func1 = () => ThreadTest1();
            var begin = func1.BeginInvoke(null, null);
            int result = func1.EndInvoke(begin);  // 等待執行緒結束方法1
            Console.WriteLine($"ThreadTest1子執行緒結束,result={result}");

            //--------------------------------------------------------
            TaskFactory fanctory = new TaskFactory();
            List<Task> taskList = new List<Task>();
            taskList.Add(fanctory.StartNew(() =>
            {
                for (int i = 0; i < 10; i++)
                {
                    Thread.Sleep(100);
                    Console.WriteLine($"fanctory任務{i}");
                }
            }));
            Task.WaitAll(taskList.ToArray());  // 等待執行緒結束方法2

            //--------------------------------------------------------
            for (int i = 0; i < 5; i++)
            {
                int k = i;
                Console.WriteLine($"【2】--------主執行緒{k}啟動-----------");
                taskList.Add(fanctory.StartNew(() =>
                {
                    for (int j = 0; j < 5; j++)
                    {
                        Console.WriteLine($"【2】.子執行緒{k}-{j}啟動");
                    }
                }));
                Task.WaitAll(taskList.ToArray());  // 等待該主執行緒裡的所有子執行緒都結束再進入下一個主執行緒
            }

            //--------------------------------------------------------
            for (int j = 0; j < 10; j++)
            {
                int k = j;
                Task.Run(() =>
                {
                    int res = ThreadTest1();
                    Console.WriteLine($"《3》.子執行緒{k}啟動,結果={res}");
                    return res;
                });
                Task.WaitAll();  // 確保for迴圈按順序執行
            }

            //--------------------------Thread--------------------------------
            for (int i = 1; i < 5; i++)
            {
                Console.WriteLine("----------Thread主執行緒 " + i + " 開始------------");
                Thread thread1 = new Thread(()=> { DosomeThing();}); // 調無參方法
                //Thread thread2 = new Thread(new ThreadStart(DosomeThing)); // 調無參方法
                Thread thread3 = new Thread(new ParameterizedThreadStart(DosomeThing));  // 帶引數

                thread1.Start();
                //thread2.Start();
                thread3.Start(i);
                Thread.Sleep(1000);
            }

            //-------------------------------執行緒池---------------------------------------//
            ThreadPool.QueueUserWorkItem(DosomeThing, "********執行緒池測試引數***********");


            Console.WriteLine($"ThreadTest1主執行緒結束");
            Console.ReadKey();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        private static int ThreadTest1()
        {
            int result = 0;
            for (int i = 0; i < 1000000; i++)
            {
                result += i;
            }
            return result;
        }

        /// <summary>
        /// 
        /// </summary>
        public static void DosomeThing()
        {
            for (int i = 1; i < 5; i++)
            {
                //Thread.Sleep(1000);
                Console.WriteLine("這是不帶引數的子執行緒:" + i);
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="paramer"></param>
        public static void DosomeThing(object paramer)
        {
            for (int i = 1; i < 4; i++)
            {
                //Thread.Sleep(1000);
                Console.WriteLine("這是帶引數子執行緒 " + i + " 的引數 " + paramer);
            }
        }
    }
}

執行結果圖

執行結果圖1
執行結果圖2