iT邦幫忙

2023 iThome 鐵人賽

DAY 16
0
Software Development

C# 學習之路系列 第 17

[DAY16] C#基礎與實作(異步程式設計)

  • 分享至 

  • xImage
  •  

C# 程式基礎

異步程式設計 (Asynchronous Programming):

步驟1:定義異步方法:

在 C# 中,異步方法使用 async 修飾符定義,並且返回 Task 或 Task<TResult>。
  • 程式實作:
    public async Task MyAsyncMethod()
    {
        // 在這裡執行非同步操作
    }
    

步驟2:使用 await 關鍵字:

在異步方法中,使用 await 關鍵字來等待非同步操作完成。這樣可以使執行緒不被阻塞,並允許其他工作繼續進行。
  • 程式實作:
    public async Task MyAsyncMethod()
    {
        // 非同步操作
        await SomeAsyncOperation();
        // 非同步操作完成後繼續執行
    }
    

步驟3:呼叫異步方法:

在主程式中,以呼叫異步方法。如果主程式也是異步的,可以使用 await 關鍵字等待異步方法完成。
  • 程式實作:
    public async Task MainAsync()
    {
        await MyAsyncMethod();
        // 繼續執行其他操作
    }
    

步驟4:處理異常

在異步程式設計中,異常處理也是重要的一部分。可以使用 try-catch 塊來處理異常。
  • 程式實作:
    public async Task MyAsyncMethod()
    {
        try
        {
            // 非同步操作
            await SomeAsyncOperation();
        }
        catch (Exception ex)
        {
            // 處理異常
            Console.WriteLine("異常:" + ex.Message);
        }
    }
    

程式實作練習:

  • 題目:
    依照上方步驟,寫一個讀取和寫入檔案的異步程式設計

  • 程式實作:

    using System;
    using System.IO;
    using System.Text;
    using System.Threading.Tasks;
    
    class FileReadWriteExample
    {
        // 步驟1:定義異步方法
        public async Task<string> ReadFileAsync(string filePath)
        {
            using (StreamReader reader = new StreamReader(filePath))
            {
                // 使用 StreamReader 的 ReadToEndAsync 方法異步讀取檔案內容
                // 步驟2:使用 await 關鍵字
                return await reader.ReadToEndAsync();
            }
        }
    
        // 步驟1:定義異步方法
        public async Task WriteFileAsync(string filePath, string content)
        {
            using (StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8))
            {
                // 使用 StreamWriter 的 WriteAsync 方法異步寫入檔案
                // 步驟2:使用 await 關鍵字
                await writer.WriteAsync(content);
            }
        }
    }
    
    class Program
    {
        static async Task Main()
        {
            FileReadWriteExample fileReadWrite = new FileReadWriteExample();
    
            try
            {
                string filePath = "D:\\sample.txt";
    
                // 步驟3:呼叫異步方法
                // 讀取檔案
                string content = await fileReadWrite.ReadFileAsync(filePath);
                Console.WriteLine("讀取完成!");
                Console.WriteLine("內容:");
                Console.WriteLine(content);
    
                // 步驟3:呼叫異步方法
                // 寫入檔案
                string newText = "這是新的內容。";
                await fileReadWrite.WriteFileAsync(filePath, newText);
                Console.WriteLine("寫入完成!");
            }
            catch (Exception ex)
            {
                // 步驟4:處理異常
                Console.WriteLine("處理檔案時出現異常:" + ex.Message);
            }
        }
    }
    
    

參考來源

  1. ChatGPT
  2. C#最強入門邁向頂尖高手之路王者歸來
  3. w3schools C#

期望挑戰30天持續更新成功 ~ DAY16


上一篇
[DAY15] C#基礎與實作(進階-檔案處理)
下一篇
[DAY17] C#基礎與實作(泛型)
系列文
C# 學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言