首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[C#][原创]异步编程的研究

[C#][原创]异步编程的研究

作者头像
云未归来
发布2025-07-18 14:09:39
发布2025-07-18 14:09:39
940
举报

 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 异步编程的研究

{

    public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        //async 声明一个包含异步代码的函数,该函数执行时不会阻塞调用线程。sync里面的函数执行没遇到await前还是在主线程执行,遇到await就在异步子线程执行,不会阻塞继续往下执行

        //async一般和await同时出现,也可以没有await,没有await就相当于主线程执行

        //async标记的函数返回值必须为 void ,Task,Task<TResult>

        //await 必须修饰Task 或者Task<TResult>

        private void button1_Click(object sender, EventArgs e)

        {

            执行耗时方法();

            Console.WriteLine("11111111");

            //执行结果是先显示222222,然后显示1111,过来6秒,显示3333

            //解释,函数执行耗时方法();进去后没有标记await的在主线程执行,所以或显示222222

            //遇到await就是子线程执行,因为await后面用task这个子线程,于是不会阻塞主线程执行,但是会阻塞下面代码执行,然后回到

            //主线程输出了1111111,干累活执行6秒异步返回了,所以会继续下面代码执行,输出了333333

        }

        public async void 执行耗时方法()

        {

            Console.WriteLine("2222222");

            await Task.Run(() => 干累活());

            Console.WriteLine("33333");

        }

        public async Task 干累活()

        {

            for (int i = 0; i < 6; i++)

            {

                await Task.Run(() =>

             {

                 Thread.Sleep(1000);

             });

            }

        }

        private void Form1_Load(object sender, EventArgs e)

        {

        }

        private void button2_Click(object sender, EventArgs e)

        {

            Console.WriteLine("111");

            执行耗时方法2();

            Console.WriteLine("222");

            //执行结果是先显示111,然后显示333,再显示222,过来6秒,显示over

            //解释,函数执行耗时方法2();进去后先显示111,没有标记await的在主线程执行,所以显示333

            //遇到await就是子线程执行,因为await后面用task这个子线程,于是不会阻塞主线程执行,但是会阻塞下面代码执行,然后回到

            //主线程输出了222,干累活2执行6秒异步返回了,所以会继续下面代码执行,输出了333333

        }

        public async void 执行耗时方法2()

        {

            Console.WriteLine("333");

            var result = await Task.Run(() => 干累活2());

            Console.WriteLine(result);

        }

        public async Task<string> 干累活2()

        {

            for (int i = 0; i < 6; i++)

            {

                await Task.Run(() =>

                {

                    Thread.Sleep(1000);

                });

            }

            return "over";

        }

    }

}

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-02-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档