什么样的方法才有必要定义成异步async标记的?

在 C# 中,需要 async 的情况:

1.I/O 密集型操作

a.网络通信

    // 串口通信(您的代码中的例子)
    public async Task<bool> SendAsync(byte[] data)
    {
        await Task.Run(() => currentPort.Write(data, 0, data.Length));
        return true;
    }
    
    // HTTP 请求
    public async Task<string> GetDataAsync(string url)
    {
        using var client = new HttpClient();
        return await client.GetStringAsync(url);
    }

    b.文件操作

    public async Task<string> ReadFileAsync(string path)
    {
        return await File.ReadAllTextAsync(path);
    }
    
    public async Task SaveFileAsync(string path, string content)
    {
        await File.WriteAllTextAsync(path, content);
    }

    c.数据库操作

    public async Task<List<User>> GetUsersAsync()
    {
        return await context.Users.ToListAsync();
    }

    2.长时间运行的计算任务

    public async Task<int> CalculateAsync(int[] numbers)
    {
        return await Task.Run(() => 
        {
            // 复杂计算,避免阻塞 UI 线程
            return numbers.Sum(x => x * x);
        });
    }

    3.延时操作

    public async Task<bool> ConnectAsync(string portName, int baudRate = 115200)
    {
        var result = await _serialPortService.OpenAsync(portName, baudRate);
        if (result)
        {
            await Task.Delay(500); // 等待设备稳定
            await QueryStatusAsync();
        }
        return result;
    }

    4.调用其他异步方法

    public async Task<bool> QueryStatusAsync()
    {
        try
        {
            var frame = _protocolBuilder.BuildQueryStatusCommand();
            var data = frame.ToByteArray();
            
            // 调用另一个异步方法
            var result = await _serialPortService.SendAsync(data);
            return result;
        }
        catch (Exception ex)
        {
            _logger.LogError(ex, "查询设备状态失败");
            return false;
        }
    }

    不需要 async 的情况

    1.纯计算或简单操作

    // 不需要 async
    public bool IsConnected => _serialPortService.IsConnected;
    
    public string GetFrameDescription(ProtocolFrame frame)
    {
        var command = (CommandType)frame.Command;
        return command switch
        {
            CommandType.QueryStatus => "状态查询响应",
            CommandType.DoorAction => "门动作通知",
            _ => $"未知命令: 0x{frame.Command:X4}"
        };
    }

    2.事件处理程序(通常)

    // 不需要 async(除非内部有异步操作)
    private void OnConnectionChanged(object? sender, bool isConnected)
    {
        ConnectionChanged?.Invoke(this, isConnected);
    }

    发表回复