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

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

開發(fā)
本文將介紹 .NET 異步編程的正確方法,幫助你避免常見陷阱并充分發(fā)揮異步編程的優(yōu)勢(shì)。

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

關(guān)鍵要點(diǎn)總結(jié)

(1) 優(yōu)先使用內(nèi)置異步API

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

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

  • 適用于I/O密集型操作(網(wǎng)絡(luò)請(qǐng)求、文件讀寫、數(shù)據(jù)庫(kù)查詢等)
  • 對(duì)于CPU密集型操作,Task.Run可能仍然是合適的選擇,但應(yīng)謹(jǐn)慎使用

(3) 正確處理異步流

  • 使用await foreach處理大型數(shù)據(jù)集,避免內(nèi)存溢出
  • 結(jié)合EF Core的AsAsyncEnumerable實(shí)現(xiàn)高效的數(shù)據(jù)處理

(4) 并行與并發(fā)控制

  • 使用Task.WhenAll并行執(zhí)行多個(gè)獨(dú)立任務(wù)
  • 使用SemaphoreSlim控制并發(fā)度,避免資源耗盡

(5) 錯(cuò)誤處理與取消機(jī)制

  • 始終使用try-catch塊捕獲異步操作中的異常
  • 使用CancellationToken實(shí)現(xiàn)操作取消,提高響應(yīng)性

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

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

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

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. 使用內(nèi)置的異步API而非Task.Run
    public static async Task<string> DownloadFileAsync(string url)
    {
        using var client = new HttpClient();
        // 正確方式:使用內(nèi)置的異步方法
        return await client.GetStringAsync(url);


        // 錯(cuò)誤方式:使用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();


        // 處理內(nèi)容
        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)
    {
        // 模擬內(nèi)容處理
        return content.ToUpper();
    }


    // 3. 數(shù)據(jù)庫(kù)操作的異步模式 (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();


        // 流式處理大集合,避免一次性加載全部數(shù)據(jù)
        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)
    {
        // 創(chuàng)建所有下載任務(wù)
        var downloadTasks = urls.Select(url => DownloadAndSaveFileAsync(url));


        // 并行執(zhí)行所有任務(wù)
        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. 異步模式中的錯(cuò)誤處理
    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($"發(fā)生未知錯(cuò)誤: {ex.Message}");
        }
    }


    private static Task ProcessDownloadedContentAsync(string content)
    {
        // 處理下載內(nèi)容
        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線程上阻塞
    // 假設(shè)這是在WPF/WinForms/UWP應(yīng)用中
    public static async void ButtonClickHandler(object sender, EventArgs e)
    {
        // 錯(cuò)誤方式:在UI線程上等待任務(wù)完成
        // var result = LongRunningOperation().Result; // 會(huì)導(dǎo)致UI卡頓


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


    private static async Task LongRunningOperationAsync()
    {
        await Task.Delay(5000); // 模擬長(zhǎng)時(shí)間運(yùn)行的操作
        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); // 模擬處理時(shí)間
        Console.WriteLine($"處理項(xiàng): {item}");
    }
}


// 簡(jiǎn)單的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; }
}

責(zé)任編輯:趙寧寧 來源: 后端Q
相關(guān)推薦

2021-11-25 07:43:56

CIOIT董事會(huì)

2021-11-10 16:03:42

Pyecharts Python可視化

2022-08-16 08:33:06

DevOps實(shí)踐

2019-03-17 16:48:51

物聯(lián)網(wǎng)云計(jì)算數(shù)據(jù)信息

2020-05-09 10:35:06

遞歸面試算法

2025-03-12 11:14:45

2021-06-07 10:05:56

性能優(yōu)化Kafka

2021-10-09 15:49:00

5G網(wǎng)絡(luò)技術(shù)

2018-10-29 15:20:03

2025-01-15 12:31:46

2022-03-22 07:37:04

FeignSpringRibbon

2016-03-01 14:51:18

云計(jì)算DevOps

2019-02-20 14:35:57

區(qū)塊鏈數(shù)字貨幣比特幣

2016-01-08 11:00:14

OpenStack云計(jì)算

2024-12-23 06:20:00

2024-03-06 13:23:56

Task.RunC#異步陷阱

2023-07-10 09:38:06

兼容性測(cè)試方案

2017-08-02 10:43:39

深度學(xué)習(xí)TensorFlowRNN

2025-04-30 08:20:58

2025-02-17 06:00:00

Task.Run.NET開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 亚洲精品小视频在线观看 | 国产区视频在线观看 | 日韩精品一区二 | 国产精品 欧美精品 | 成人a网| 国产成人一区在线 | 久久精品国产一区二区三区 | 成人三级网址 | 亚洲aⅴ | 久久精品一| 一本久久a久久精品亚洲 | 久久国产精品亚洲 | 国产成人免费视频网站高清观看视频 | 日韩激情在线 | 国产欧美一区二区三区国产幕精品 | 精品国产成人 | 天天草天天射 | 成人亚洲精品 | 亚洲成人精品久久久 | 天天操夜夜艹 | 偷拍自拍网站 | 欧美中文字幕一区二区三区亚洲 | 日韩在线免费视频 | 黄色片视频网站 | 国产精品成人在线 | 成人做爰www免费看 午夜精品久久久久久久久久久久 | 亚洲一区亚洲二区 | www国产精品 | 91精品国产一区二区三区动漫 | 国产精品免费一区二区三区四区 | 亚洲高清视频一区二区 | 日本手机在线 | 欧美一区二区三区四区五区无卡码 | 高清色视频 | 久久久91精品国产一区二区三区 | 激情五月婷婷丁香 | 亚洲成人免费网址 | 在线视频国产一区 | 亚洲国产激情 | 成人美女免费网站视频 | 阿v视频在线观看 |