↓ 跳过正文

Task的简单使用

·1 分钟
作者
Hexin
在确定的逻辑与不确定的现实之间,做一名耐心的构建者。

关于Task().Run,Task的使用

1. 针对 I/O 密集型 (网络、数据库、文件)
#

  • 口诀:“原生异步,直接等待”
  • 方法定义:必须带 async 和 Task,不要在里面写 Task.Run。
  • 调用方式:直接 await。
// 定义:利用底层机制,不占线程
private async Task<string> GetDataAsync()
{
    // 内部 await 原生 API
    return await HttpClient.GetStringAsync(...);
}

// 调用
string result = await GetDataAsync();

2. 针对 CPU 密集型 (计算、死循环、图像处理)
#

  • 口诀:“同步定义,手动跑偏” (指手动扔到偏僻的后台线程去)
  • 方法定义:普通的同步方法,不需要 async,不需要 Task。
  • 调用方式:用 Task.Run 包裹后再 await。
// 定义:老老实实的普通方法
private int Calculate()
{
    Thread.Sleep(5000); // 模拟狂算
    return 100;
}

// 调用:由 UI 层决定把它踢到后台
int result = await Task.Run(() => Calculate());

唯一的小建议 (命名规范)
#

在 I/O 密集型的方法(你的 方法A)后面,按照微软规范,最好加上 Async 后缀。

  • GetUserInfoAsync()
  • DownloadFileAsync()

这样你调用的时候,看到名字带 Async,就知道:“哦,这个可以直接 await,不需要我开 Task.Run”。