5.2C#异步编程场景

C#异步编程场景分为 I/O 绑定(例如从网络请求数据、访问数据库或读取和写入到文件系统)和 CPU 绑定(例如执行成本高昂的计算)。

I/O 绑定场景:从 Web 服务下载数据

对于 I/O 绑定代码,等待一个在 async 方法中返回 Task 或 Task<T> 的操作。

请使用 async 和 await(而不使用 Task.Run),不应使用任务并行库

private readonly HttpClient _httpClient = new HttpClient();

downloadButton.Clicked += async (o, e) =>
{
    // This line will yield control to the UI as the request
    // from the web service is happening.
    //
    // The UI thread is now free to perform other work.
    var stringData = await _httpClient.GetStringAsync(URL);
    DoSomethingWithData(stringData);
};

CPU 绑定场景:为游戏执行计算

对于 CPU 绑定代码,等待一个使用 Task.Run 方法在后台线程启动的操作。

请使用 async 和 await,但在另一个线程上使用 Task.Run 生成工作。如果该工作同时适用于并发和并行,还应考虑使用任务并行库

private DamageResult CalculateDamageDone()
{
    // Code omitted:
    //
    // Does an expensive calculation and returns
    // the result of that calculation.
}

calculateButton.Clicked += async (o, e) =>
{
    // This line will yield control to the UI while CalculateDamageDone()
    // performs its work. The UI thread is free to perform other work.
    var damageResult = await Task.Run(() => CalculateDamageDone());
    DisplayDamage(damageResult);
};

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/11605.html

(0)
上一篇 2021年5月2日 21:38
下一篇 2021年5月3日 01:38

相关推荐

  • 1.6C#语言的选择(Selection)、迭代(Iteration)、跳转(Jump)语句

    1.if选择 2.if-else选择 3.if-else-if-else选择 4.switch选择 default case 指定匹配表达式与其他任何 case 模式都不匹配时要执行的语句。 通常在每个 switch section末尾使用 break 语句将控制从 switch…

    C#语言教程 2021年1月6日
    05600
  • 3.5C#引用类型之接口(Interface)

    1.接口声明 接口包含一组非抽象class或struct必须实现的相关功能的定义。 2.继承 接口 可以继承自多个基接口。 3.实现 3.1实现 类 或 结构 可以实现多个接口,实现接口的类或结构必须实现其所有未提供默认实现的成员并匹配接口中的成员签名,非必须重写实现具有默认实现的成员。 3.2默认实现 接口…

    C#语言教程 2021年3月5日
    05580
  • 3.7C#引用类型之数组(Array)

    数组(Array)是一种数据结构,可以用一个统一的数组名和不同的下标(或称索引,index)来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、多维数组和交错数组。 数组中的元素是有序的,包含 Length 个元素的数组从 0 索引到 Length-1。 数组中的元素必须属于同一个类型,而且可以随时替换元素。…

    C#语言教程 2021年3月7日
    05500

发表回复

登录后才能评论