在 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);
}