成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

放棄Task.Run!這才是.NET異步編程的正確打開方式

開發
本文將介紹 .NET 異步編程的正確方法,幫助你避免常見陷阱并充分發揮異步編程的優勢。

在.NET中進行異步編程時,許多開發者習慣使用Task.Run將工作卸載到線程池,但這往往不是最佳選擇。本文將介紹.NET異步編程的正確方法,幫助你避免常見陷阱并充分發揮異步編程的優勢。

關鍵要點總結

(1) 優先使用內置異步API

  • 大多數.NET庫都提供了異步版本的方法(如File.ReadAllTextAsync、HttpClient.GetStringAsync)
  • 避免使用Task.Run包裝同步方法,這會增加線程池壓力并可能導致性能下降

(2) 了解異步操作的適用場景

  • 適用于I/O密集型操作(網絡請求、文件讀寫、數據庫查詢等)
  • 對于CPU密集型操作,Task.Run可能仍然是合適的選擇,但應謹慎使用

(3) 正確處理異步流

  • 使用await foreach處理大型數據集,避免內存溢出
  • 結合EF Core的AsAsyncEnumerable實現高效的數據處理

(4) 并行與并發控制

  • 使用Task.WhenAll并行執行多個獨立任務
  • 使用SemaphoreSlim控制并發度,避免資源耗盡

(5) 錯誤處理與取消機制

  • 始終使用try-catch塊捕獲異步操作中的異常
  • 使用CancellationToken實現操作取消,提高響應性

(6) UI應用中的異步編程

  • 在UI線程上永遠不要阻塞(避免使用.Result或.Wait())
  • 使用async/await保持UI的響應性

遵循這些最佳實踐,你可以編寫出更高效、更可靠的異步代碼,充分發揮.NET平臺的異步編程能力,同時避免常見的陷阱和性能問題。

using System;
using System.IO;
using System.Net.Http;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;


public static class AsyncBestPractices
{
    // 1. 使用內置的異步API而非Task.Run
    public static async Task<string> DownloadFileAsync(string url)
    {
        using var client = new HttpClient();
        // 正確方式:使用內置的異步方法
        return await client.GetStringAsync(url);


        // 錯誤方式:使用Task.Run包裝同步方法
        // return await Task.Run(() => client.GetString(url));
    }


    // 2. 文件操作的異步模式
    public static async Task ProcessFileAsync(string filePath)
    {
        // 讀取文件異步
        await using var fileStream = new FileStream(
            filePath, 
            FileMode.Open, 
            FileAccess.Read, 
            FileShare.Read,
            bufferSize: 4096, 
            useAsync: true); // 確保使用異步I/O


        using var reader = new StreamReader(fileStream);
        string content = await reader.ReadToEndAsync();


        // 處理內容
        var processedContent = ProcessContent(content);


        // 寫回文件異步
        await using var outputStream = new FileStream(
            filePath + ".processed", 
            FileMode.Create, 
            FileAccess.Write, 
            FileShare.None,
            bufferSize: 4096, 
            useAsync: true);


        using var writer = new StreamWriter(outputStream);
        await writer.WriteAsync(processedContent);
    }


    private static string ProcessContent(string content)
    {
        // 模擬內容處理
        return content.ToUpper();
    }


    // 3. 數據庫操作的異步模式 (Entity Framework Core)
    public static async Task<Order> GetOrderAsync(int orderId)
    {
        using var context = new OrderDbContext();
        // 使用EF Core的異步方法
        return await context.Orders.FindAsync(orderId);
    }


    // 4. 正確處理異步集合
    public static async Task ProcessOrdersAsync()
    {
        using var context = new OrderDbContext();


        // 流式處理大集合,避免一次性加載全部數據
        await foreach (var order in context.Orders.AsAsyncEnumerable())
        {
            await ProcessOrderAsync(order);
        }
    }


    private static async Task ProcessOrderAsync(Order order)
    {
        // 模擬異步處理訂單
        await Task.Delay(10); // 模擬IO操作
        Console.WriteLine($"處理訂單: {order.Id}");
    }


    // 5. 并行異步操作
    public static async Task DownloadMultipleFilesAsync(string[] urls)
    {
        // 創建所有下載任務
        var downloadTasks = urls.Select(url => DownloadAndSaveFileAsync(url));


        // 并行執行所有任務
        await Task.WhenAll(downloadTasks);
    }


    private static async Task DownloadAndSaveFileAsync(string url)
    {
        using var client = new HttpClient();
        var content = await client.GetStringAsync(url);


        var fileName = Path.GetFileName(url);
        await File.WriteAllTextAsync(fileName, content);
    }


    // 6. 異步模式中的錯誤處理
    public static async Task SafeDownloadAsync(string url)
    {
        try
        {
            using var client = new HttpClient();
            var content = await client.GetStringAsync(url);
            await ProcessDownloadedContentAsync(content);
        }
        catch (HttpRequestException ex)
        {
            Console.WriteLine($"下載失敗: {ex.Message}");
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("操作已取消");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"發生未知錯誤: {ex.Message}");
        }
    }


    private static Task ProcessDownloadedContentAsync(string content)
    {
        // 處理下載內容
        return Task.CompletedTask;
    }


    // 7. 異步模式中的CancellationToken使用
    public static async Task CancelableOperationAsync(CancellationToken cancellationToken)
    {
        using var client = new HttpClient();


        try
        {
            // 支持取消的異步操作
            var response = await client.GetAsync("https://example.com", cancellationToken);


            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync(cancellationToken);
                Console.WriteLine($"下載完成: {content.Length} 字符");
            }
        }
        catch (OperationCanceledException)
        {
            Console.WriteLine("操作被用戶取消");
        }
    }


    // 8. 避免在UI線程上阻塞
    // 假設這是在WPF/WinForms/UWP應用中
    public static async void ButtonClickHandler(object sender, EventArgs e)
    {
        // 錯誤方式:在UI線程上等待任務完成
        // var result = LongRunningOperation().Result; // 會導致UI卡頓


        // 正確方式:使用await保持UI響應性
        await LongRunningOperationAsync();
    }


    private static async Task LongRunningOperationAsync()
    {
        await Task.Delay(5000); // 模擬長時間運行的操作
        Console.WriteLine("操作完成");
    }


    // 9. 異步流處理 (IAsyncEnumerable)
    public static async IAsyncEnumerable<string> ReadLinesAsync(string filePath)
    {
        await using var fileStream = new FileStream(
            filePath, 
            FileMode.Open, 
            FileAccess.Read, 
            FileShare.Read,
            bufferSize: 4096, 
            useAsync: true);


        using var reader = new StreamReader(fileStream);


        string line;
        while ((line = await reader.ReadLineAsync()) != null)
        {
            yield return line;
        }
    }


    // 10. 異步模式中的SemaphoreSlim使用
    public static async Task ProcessItemsWithThrottleAsync(IEnumerable<string> items, int maxConcurrency = 5)
    {
        var semaphore = new SemaphoreSlim(maxConcurrency);


        var tasks = items.Select(async item =>
        {
            await semaphore.WaitAsync();


            try
            {
                await ProcessItemAsync(item);
            }
            finally
            {
                semaphore.Release();
            }
        });


        await Task.WhenAll(tasks);
    }


    private static async Task ProcessItemAsync(string item)
    {
        await Task.Delay(100); // 模擬處理時間
        Console.WriteLine($"處理項: {item}");
    }
}


// 簡單的EF Core上下文示例
public class OrderDbContext : DbContext
{
    public DbSet<Order> Orders { get; set; }


    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer("YourConnectionString");
    }
}


public class Order
{
    public int Id { get; set; }
    public string CustomerName { get; set; }
    public DateTime OrderDate { get; set; }
}

責任編輯:趙寧寧 來源: 后端Q
相關推薦

2021-11-25 07:43:56

CIOIT董事會

2021-11-10 16:03:42

Pyecharts Python可視化

2022-08-16 08:33:06

DevOps實踐

2019-03-17 16:48:51

物聯網云計算數據信息

2020-05-09 10:35:06

遞歸面試算法

2025-03-12 11:14:45

2021-06-07 10:05:56

性能優化Kafka

2021-10-09 15:49:00

5G網絡技術

2018-10-29 15:20:03

2025-01-15 12:31:46

2022-03-22 07:37:04

FeignSpringRibbon

2016-01-08 11:00:14

OpenStack云計算

2019-02-20 14:35:57

區塊鏈數字貨幣比特幣

2016-03-01 14:51:18

云計算DevOps

2024-12-23 06:20:00

2024-03-06 13:23:56

Task.RunC#異步陷阱

2017-08-02 10:43:39

深度學習TensorFlowRNN

2023-07-10 09:38:06

兼容性測試方案

2025-04-30 08:20:58

2025-02-17 06:00:00

Task.Run.NET開發
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美性受xxxx白人性爽 | 亚洲高清电影 | 国产高清视频一区 | aaa精品 | 国产99视频精品免费播放照片 | 亚洲成人精品国产 | 黄色大片免费看 | 男女免费网站 | 色网站在线 | 精品国产乱码久久久久久闺蜜 | 午夜精品久久久久久久久久久久久 | 欧洲成人午夜免费大片 | 美女一区| 国产四区 | 亚洲草草视频 | 精品久久不卡 | 国产精品久久久久国产a级 欧美日本韩国一区二区 | 亚洲网在线 | 精品网| 国产综合av | 一道本不卡视频 | 亚洲精品1区 | 国产在线精品免费 | 亚洲国产电影 | 久久久毛片 | av在线天堂网 | 91av入口 | 免费在线观看黄色av | 区一区二区三在线观看 | 999久久久| 国产精品自拍av | 亚洲精品久| 国产精品精品视频一区二区三区 | 国产精品一区二区在线播放 | 亚洲视频免费在线看 | 我爱操 | 欧美大片黄 | 中文字幕国产在线 | v亚洲 | 亚洲一区二区视频 | 一级毛片免费 |