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!";
}
}
}