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

相关推荐

  • 2.5C#函数成员之属性(Property)

    1.属性声明 属性的声明方式与字段相似,区别是属性声明以在分隔符 { 和 } 之间写入的 get 访问器或 set 访问器结束,而不是以分号结束。 属性需与字段配套使用,字段是数据成员(定义存储位置),而属性是为了操作private字段而生的函数成员(不定义存储位置)。 自动实现…

    C#语言教程 2021年2月5日
    02640
  • 3.12C#类型之记录结构(record struct)和记录类(record class)

    1.记录声明 声明记录结构(值类型)或记录类(引用类型)的语法与声明结构或类的语法相似,可使用位置参数或属性语法声明记录类型。 记录类型可以是不可变类型,也可以是可变类型,但记录类型的发明主要是为创建自定义不可变类型提供简洁的语法。 编译器会为记录的每个位置参数自动创建public自动实现的属性,如果生成的自动实现的属…

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

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

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

发表评论

登录后才能评论