C#异步编程与多线程编程

C#5.0推出了异步编程,通过关键字async 和 await及返回类型为Task(无返回值的异步方法)和Task(返回值为T的异步方法)可以将方法封装为异步方法。调用异步方法时,遇到await关键字程序会立即返回到调用者,直到await后的方法执行完成。包括两种异步方式:I/O绑定代码、CPU绑定代码

I/O 绑定示例:从 Web 服务下载数据

你可能需要在按下按钮时从 Web 服务下载某些数据,但不希望阻止 UI 线程。 只需执行如下操作即可轻松实现:
C#
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);
};
就是这么简单! 代码表示目的(异步下载某些数据),而不会在与任务对象的交互中停滞。
在整个过程中,关键点在于没有线程专用于运行任务,即没有使用额外的线程。 尽管需要在一些上下文中执行工作(即,操作系统确实必须将数据传递到设备驱动程序并响应中断),但没有专用于等待数据从请求返回的线程。 这让系统能处理更多的工作而不是等待某些 I/O 调用结束。

CPU 绑定示例:为游戏执行计算

假设你正在编写一个移动游戏,在该游戏中,按下某个按钮将会对屏幕中的许多敌人造成伤害。 执行伤害计算的开销可能极大,而且在 UI 线程中执行计算有可能使游戏在计算执行过程中暂停!
此问题的最佳解决方法是启动一个后台线程,它使用 Task.Run 执行工作,并 await 其结果。 这可确保在执行工作时 UI 能流畅运行。
C#
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);
};
可见CPU绑定时是通过额外开线程来实现异步的,即多线程。

异步编程与多线程的区别

多线程和异步编程是两个不同的概念。多线程的应用场景是针对同时有多个任务需要处理的情形;异步编程针对的是同步编程导致的线程阻塞的场景。
异步编程的CPU代码绑定通过多线程来实现。
更多关于多线程的文章收藏:https://www.cnblogs.com/yunfeifei/p/4106318.html

猜你喜欢

转载自blog.csdn.net/qq_33788547/article/details/84142174