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

猜你喜欢

转载自blog.csdn.net/qq_31176861/article/details/82593986