C# C-Sharp คือ ตอนที่ 9 : การเขียนโปรแกรมแบบมัลติเธรด (Multithreading) และอะซิงโครนัส (Asynchronous)

  1. มัลติเธรด (Multithreading) คืออะไร
  2. มัลติเธรด (Multithreading) ใน C#
  3. การเขียนโปรแกรมแบบอะซิงโครนัส (Asynchronous Programming)
  4. การรวม Multithreading และ Asynchronous Programming ในการพัฒนา Application

การเขียนโปรแกรมแบบมัลติเธรดและอะซิงโครนัสเป็นแนวคิดที่สำคัญในการทำแอพสมัยใหม่ โดยเฉพาะอย่างยิ่งเมื่อทำแอพที่ต้องการการตอบสนองและประสิทธิภาพสูง ใน C# กระบวนทัศน์ทั้งสองนี้ได้รับการสนับสนุนอย่างกว้างขวาง ทำให้นักพัฒนามีเครื่องมือที่จำเป็นในการทำแอพที่แข็งแกร่งและมีประสิทธิภาพสูง มาทำความเข้าใจแนวคิดเหล่านี้และการใช้งานจริงให้ลึกยิ่งขึ้น

1. มัลติเธรด (Multithreading) คืออะไร

ในระบบคอมพิวเตอร์ทั่วไป การดำเนินการเดียวที่ต้องดำเนินการเรียกว่า ‘process’ และทุกกระบวนการสามารถมี ‘เธรด’ ได้ตั้งแต่หนึ่งเธรดขึ้นไป แต่ละเธรดแสดงลำดับการดำเนินการที่แยกจากกันซึ่งสามารถดำเนินการพร้อมกันกับเธรดอื่นๆ มัลติเธรดคือการใช้หลายเธรดภายในกระบวนการเดียวเพื่อดำเนินการหลายอย่างพร้อมกัน

การทำงานพร้อมกันนี้สามารถปรับปรุงประสิทธิภาพของแอปพลิเคชันได้อย่างมาก โดยเฉพาะอย่างยิ่งสำหรับแอปพลิเคชันที่ต้องใช้ I/O มากหรือใช้ CPU มาก เช่น แอปพลิเคชันที่ต้องโต้ตอบกับระบบไฟล์หรือเครือข่าย หรือดำเนินการคำนวณที่ซับซ้อน

2. มัลติเธรด (Multithreading) ใน C#

ใน C# คุณสามารถสร้างเธรดใหม่ได้โดยสร้างอินสแตนซ์ของคลาส Thread ซึ่งเป็นส่วนหนึ่งของเนมสเปซ System.Threading นี่คือตัวอย่างง่ายๆ:

using System;
using System.Threading;

class Program
{
    static void Main()
    {
        Thread newThread = new Thread(new ThreadStart(Work));
        newThread.Start(); // Starts the new thread.
    }

    static void Work()
    {
        // Code to be executed on the new thread goes here.
        Console.WriteLine("Working on a new thread.");
    }
}

ในโค้ดนี้เมธอด Work จะดำเนินการในเธรดที่แยกจากกัน ทำให้เมธอด Main สามารถดำเนินการงานอื่นๆ ต่อไปได้พร้อมๆ กัน

3. การเขียนโปรแกรมแบบอะซิงโครนัส (Asynchronous Programming)

แม้ว่าการทำงานแบบมัลติเธรดจะช่วยปรับปรุงประสิทธิภาพของแอปพลิเคชันได้ แต่ก็ทำให้เกิดความซับซ้อน เช่น สภาวะการแข่งขันและการหยุดชะงัก ซึ่งอาจทำให้แอปพลิเคชันไม่เสถียรหรือแก้ไขจุดบกพร่องได้ยาก การเขียนโปรแกรมแบบอะซิงโครนัสเป็นอีกแนวทางหนึ่งที่ช่วยให้คุณสามารถดำเนินการที่มีความยาวได้โดยไม่ปิดกั้นเธรดหลัก แต่มีความซับซ้อนน้อยกว่าแบบมัลติเธรด

การเขียนโปรแกรมแบบอะซิงโครนัสใน C# ขึ้นอยู่กับคลาส Task async และคีย์เวิร์ด await Task แสดงถึงการดำเนินการเดี่ยวที่มักจะทำงานบนเธรดแยกต่างหาก และสามารถรอได้โดยใช้คำสำคัญ await คีย์เวิร์ด async ใช้เพื่อระบุว่าเมธอด นิพจน์แลมบ์ดา หรือเมธอดนิรนามเป็นแบบอะซิงโครนัส

ต่อไปนี้เป็นตัวอย่างของวิธีที่คุณอาจใช้การเขียนโปรแกรมแบบอะซิงโครนัสใน C#:

using System;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        await DoWorkAsync(); // Waits for the async method to complete.
    }

    static async Task DoWorkAsync()
    {
        // Simulates a lengthy operation.
        await Task.Delay(2000);
        Console.WriteLine("Async work completed.");
    }
}

ในโค้ดนี้เมธอด DoWorkAsync จะถูกทำเครื่องหมายasyncเป็น แสดงว่าเป็นเมธอดแบบอะซิงโครนัส ภายในวิธีนี้คำหลัก await จะใช้ก่อน Task.Delay(2000) ซึ่งจำลองการดำเนินการที่มีความยาว ซึ่งจะทำให้เมธอดหยุดชั่วคราวและคืนการควบคุมไปยังMainเมธอดจนกว่าการหน่วงเวลาจะเสร็จสิ้น

4. การรวม Multithreading และ Asynchronous Programming ในการพัฒนา Application

ในการทำแอพที่ใช้งานได้จริง คุณมักจะต้องรวมการเขียนโปรแกรมแบบมัลติเธรดและอะซิงโครนัสเข้าด้วยกันเพื่อให้ได้ประสิทธิภาพและการตอบสนองที่ดีที่สุด

ตัวอย่างเช่น ในเว็บแอปพลิเคชันที่พัฒนาโดยใช้ ASP.NET คุณอาจต้องดึงข้อมูลจากฐานข้อมูล ทำการคำนวณที่ซับซ้อน และเขียนลงในไฟล์บันทึกพร้อมกัน เมื่อใช้มัลติเธรด คุณสามารถดำเนินการเหล่านี้พร้อมกันได้ ปรับปรุงความเร็วโดยรวมของแอปพลิเคชันของคุณ แต่ด้วยการใช้การเขียนโปรแกรมแบบอะซิงโครนัส คุณสามารถมั่นใจได้ว่าเว็บเซิร์ฟเวอร์ยังคงตอบสนองได้ แม้ว่าจะจัดการคำขอพร้อมกันเป็นร้อยหรือพันรายการก็ตาม

ต่อไปนี้เป็นตัวอย่างของวิธีที่คุณอาจใช้ทั้งการเขียนโปรแกรมแบบมัลติเธรดและแบบอะซิงโครนัสในแอปพลิเคชัน ASP.NET:

using System;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;

public class HomeController : Controller
{
    private readonly DatabaseService _dbService;
    private readonly ComputeService _computeService;
    private readonly LoggingService _loggingService;

    public HomeController(DatabaseService dbService, ComputeService computeService, LoggingService loggingService)
    {
        _dbService = dbService;
        _computeService = computeService;
        _loggingService = loggingService;
    }

    public async Task<IActionResult> Index()
    {
        var dataTask = _dbService.GetDataAsync(); // Fetches data asynchronously.
        var computeTask = _computeService.ComputeAsync(); // Performs computation asynchronously.
        var loggingTask = _loggingService.LogAsync("Index action invoked."); // Writes to a log file asynchronously.

        await Task.WhenAll(dataTask, computeTask, loggingTask); // Waits for all tasks to complete.

        return View();
    }
}

ในโค้ดนี้ Index การดำเนินการของ HomeController การทำงานสามอย่างพร้อมกัน: การดึงข้อมูลจากฐานข้อมูล การคำนวณ และการเขียนไปยังไฟล์บันทึก งานเหล่านี้มีแนวโน้มที่จะทำงานบนเธรดที่แยกจากกัน ซึ่งช่วยปรับปรุงประสิทธิภาพของการดำเนินการ แต่เนื่องจากงานกำลังรอโดยใช้คำหลัก await เว็บเซิร์ฟเวอร์สามารถจัดการคำขออื่น ๆ ในขณะที่งานเหล่านี้กำลังดำเนินการ เพื่อให้แน่ใจว่าแอปพลิเคชันยังคงตอบสนอง


การเขียนโปรแกรมแบบมัลติเธรดและอะซิงโครนัสเป็นเครื่องมือที่มีประสิทธิภาพในกล่องเครื่องมือของโปรแกรมเมอร์ C# เมื่อใช้อย่างมีประสิทธิภาพ จะช่วยเพิ่มประสิทธิภาพและการตอบสนองของแอปพลิเคชันของคุณได้อย่างมาก เมื่อเข้าใจแนวคิดเหล่านี้และรู้ว่าจะใช้เมื่อใดและอย่างไร คุณจะสามารถทำแอพที่มีประสิทธิภาพ ตอบสนอง และเป็นมิตรกับผู้ใช้มากขึ้น ไม่ว่าคุณจะกำลังทำเว็บแอปพลิเคชันที่ซับซ้อน บริการแบ็กเอนด์ที่ต้องใช้ข้อมูลมาก หรือเกมแบบอินเทอร์แอกทีฟ การเขียนโปรแกรมแบบมัลติเธรดและอะซิงโครนัสให้เชี่ยวชาญใน C# เป็นทักษะที่มีค่าในการทำแอพ


C# C-Sharp คืออะไร

C# C-Sharp คือ ตอนที่ 8 : ไฟล์ I/O และการทำให้เป็นอนุกรม (Serialization)
C# C-Sharp คือ ตอนที่ 10 : การมอบสิทธิ์ (Delegates) และเหตุการณ์ (Events)