1. 简单描述一下同步编程和异步编程
同步编程:按照代码的顺序一行一行执行,如果某个操作需要等待(比如读取文件、网络请求、数据库操作等),那么当前的线程就会停下来,一直到这个操作完成了之后,再继续往下执行。 异步编程:在线程等待耗时操作的同时可以继续执行其他的任务。 缺点: 同步编程优: 优点:比较简单, 缺点:但是在处理耗时操作时会阻塞当前线程,效率比较低,会导致程序或用户界面响应缓慢。在多线程环境下,容易发生死锁的问题。 异步编程: 优点:等待耗时操作时不会阻塞线程,提高程序的响应性。简化了编程的复杂性,因为使用 async 和 await 这样的关键字,让代码看起来和同步代码一样简单。如果为了耗时操作新开一个线程,这样就复杂多了。 缺点:异步代码调试起来可能会难一些,因为异步代码的执行顺序可能不是一行一行按顺序来的。
2. 代码演示简单的同步编程和异步编程的区别
程序描述: 首先我添加了一个定时器,在界面上实时显示当前的时间,目的是通过时间是否变化来判断UI界面是否被卡死(程序被阻塞); 然后点击第一个按钮会发现,UI界面确实被卡死了,在 Thread.Sleep(3000) 这三秒期间,界面无法点动,时间也静止了。直到 3 秒过后,才执行到下一句话。 第二个按钮按下,时间继续流动,UI界面也不会卡死,搭配 await 的使用同样可以大道这样的目的:3 秒钟之后,再执行下一句话。 代码展示:
using System ;
using System. Collections. Generic ;
using System. ComponentModel ;
using System. Data ;
using System. Drawing ;
using System. Linq ;
using System. Text ;
using System. Threading ;
using System. Threading. Tasks ;
using System. Windows. Forms ; namespace AsyncTest
{ public partial class Form1 : Form { AsyncClass ac = new AsyncClass ( ) ; public Form1 ( ) { InitializeComponent ( ) ; timer1. Start ( ) ; } private void buttonSync_Click ( object sender, EventArgs e) { Thread. Sleep ( 3000 ) ; labelnfo. Text = "Sync Done!" ; } private async void buttonAsync_Click ( object sender, EventArgs e) { await Task. Delay ( 3000 ) ; labelnfo. Text = "Async Done!" ; await ac. AsyncMethod1 ( ) ; labelnfo. Text = "1 is Done!" ; string str = await ac. AsyncMethod2 ( ) ; labelnfo. Text = str; } private void timer1_Tick ( object sender, EventArgs e) { DateTime time = DateTime. Now; textBoxTime. Text = time. ToString ( ) ; } } public partial class AsyncClass { public async Task AsyncMethod1 ( ) { await Task. Delay ( 3000 ) ; return ; } public async Task< string > AsyncMethod2 ( ) { await Task. Delay ( 3000 ) ; return "2 is done!" ; } }
}