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日 02:32
下一篇 2021年5月3日 02:33

相关推荐

  • 3.7C#引用类型之数组(Array)

    数组是一种数据结构。 1.一维数组 如果在不初始化的情况下声明一维数组变量,则必须使用 new 运算符将数组赋予变量。  2.多维数组 多维数组是元素类型是一维数组的数组。 多维数组的维度 是 1 与 方括号内的逗号数量相加的结果。 如果在不初始化的情况下声明多维数组变量,则必须使用&nb…

    C#语言教程 2021年3月7日
    06760
  • 2.7C#函数成员之事件(Event)

    1.事件委托声明 .NET 类库中的所有事件均基于 EventHandler 委托、EventHandler<TEventArgs> 委托,一般不建议自定义委托。 第一个参数为object类型,表示能够引发事件的类的实例。 第二个参数为从 EventArgs 基类派生的子类型的…

    C#语言教程 2021年2月7日
    04130
  • 3.1C#语言的命名空间(Namespace)

    1.命名空间声明 C# 10 中可使用文件范围的命名空间声明,一个文件中的所有类型都在一个命名空间中。文件范围的命名空间不能声明嵌套的命名空间或第二个文件范围的命名空间。 可以在两个或多个声明中定义一个命名空间。 2.using指令 2.1导入其它命名空间的类型 2.2创建命名空间别名 using 指令的声明…

    C#语言教程 2021年3月1日
    07360

发表回复

登录后才能评论