當前位置: 妍妍網 > 碼農

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