C#中的同步编程和异步编程

1. 简单描述一下同步编程和异步编程

  • 同步编程:按照代码的顺序一行一行执行,如果某个操作需要等待(比如读取文件、网络请求、数据库操作等),那么当前的线程就会停下来,一直到这个操作完成了之后,再继续往下执行。
  • 异步编程:在线程等待耗时操作的同时可以继续执行其他的任务。
  • 缺点:
    • 同步编程优:
      • 优点:比较简单,
      • 缺点:但是在处理耗时操作时会阻塞当前线程,效率比较低,会导致程序或用户界面响应缓慢。在多线程环境下,容易发生死锁的问题。
    • 异步编程:
      • 优点:等待耗时操作时不会阻塞线程,提高程序的响应性。简化了编程的复杂性,因为使用 asyncawait 这样的关键字,让代码看起来和同步代码一样简单。如果为了耗时操作新开一个线程,这样就复杂多了。
      • 缺点:异步代码调试起来可能会难一些,因为异步代码的执行顺序可能不是一行一行按顺序来的。

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

3. 在机器视觉应用程序中有哪些地方是要用到多线程或者异步编程的呢?

  1. 文件读写(日志、图片、数据)
  2. mes上传(mes连接、上传数据、下载工单)
  3. 数据库操作(增删改查)
  4. 通讯(与PLC、机器人、其他传感器)

4. 在B站上发现一个把多线程讲得很生动的视频:

【C#基础教程 多线程编程入门 Thread/Task/async/await 简单秒懂!】https://www.bilibili.com/video/BV16G4y1c72R?vd_source=857a04b8f254dae4344b4d74ac1110ff

            // 创建一个任务列表
            List<Task> ts = new List<Task>();

            ts.Add(Task.Run(() =>
            {
                Thread.Sleep(3000);
                MessageBox.Show("素菜做好了");
            }));

            ts.Add(Task.Run(()=>
            {
                Thread.Sleep(5000);
                MessageBox.Show("荤菜做好了");
            }));

            // 当任务列表中的任务全部完成后,才会执行延续下来的任务
            Task.WhenAll(ts).ContinueWith(t =>
            {
                MessageBox.Show("开始吃饭");
            });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MechMaster

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值