当前位置: 欣欣网 > 码农

C#实现多线程的几种方式

2024-05-11码农

前言

多线程是C#中一个重要的概念,多线程指的是在同一进程中同时运行多个线程的机制。多线程适用于需要提高系统并发性、吞吐量和响应速度的场景,可以充分利用多核处理器和系统资源,提高应用程序的性能和效率。

多线程常用场景

  • CPU 密集型任务.

  • I/O 密集型任务.

  • 并发请求处理.

  • 大数据处理等.

  • 什么是进程?

    进程(Process)是计算机中的一个执行中的程序,它是对正在运行的程序的抽象。一个进程包括了程序的代码、数据、堆栈以及其他操作系统所需的资源。

    什么是线程?

    线程(Thread)是进程中的一个执行单元,一个进程可以包含多个线程,它们共享进程的资源,但拥有独立的执行流程。

    使用 Thread 类

    public static void ThreadMethod()
    {
    var newThread = new Thread(WorkerMethod);
    newThread.Start();
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"ThreadMethod 主线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }
    private static void WorkerMethod()
    {
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }

    使用 ThreadPool 类

    public static void ThreadPoolMethod()
    {
    ThreadPool.QueueUserWorkItem(o => WorkerMethod());
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"ThreadPoolMethod 主线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }
    private static void WorkerMethod()
    {
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }

    使用 Task 类

    public static void TaskMethod()
    {
    Task.Run(() => WorkerMethod());
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"TaskMethod 主线程开始工作:{i}");
    Task.Delay(100).Wait();
    }
    }
    private static void WorkerMethod()
    {
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }

    使用 Parallel 类

    public static void ParallelMethod()
    {
    Parallel.Invoke(WorkerMethod, WorkerMethodOther1, WorkerMethodOther2);
    }
    private static void WorkerMethod()
    {
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"WorkerMethod 辅助线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }
    private static void WorkerMethodOther1()
    {
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"WorkerMethodOther1 辅助线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }
    private static void WorkerMethodOther2()
    {
    for (int i = 0; i < 8; i++)
    {
    Console.WriteLine($"WorkerMethodOther2 辅助线程开始工作:{i}");
    Thread.Sleep(100);
    }
    }

    拾遗补漏合集

    在这个快速发展的技术世界中,时常会有一些重要的知识点、信息或细节被忽略或遗漏。【C#/.NET/.NET Core拾遗补漏】专栏我们将探讨一些可能被忽略或遗漏的重要知识点、信息或细节,以帮助大家更全面地了解这些技术栈的特性和发展方向。

    GitHub开源地址

    https://github.com/YSGStudyHards/DotNetGuide/blob/main/docs/DotNet/DotNetStudy.md

    拾遗补漏知识点投稿

    该Issues主要是给各位小伙伴们提供投稿的地方,你有什么想要学习的C#/.NET/.NET Core相关技术栈或者已学习过且有文章输出的欢迎在投稿!

    https://github.com/YSGStudyHards/DotNetGuide/issues/37