随便玩玩之C# 14 异步方法

 

随便玩玩之C# 14 异步方法

举个例子吧。做一碗牛肉面,需要烧水、切菜、切肉,正常人的做法是先烧水,然后切菜切肉炒菜,然后水开了下面条,然后拌一拌即可使用,总结一下就是你干着一件事,我去做另外的事情,你做好了给我说一下。而电脑的做法是烧水等水开,下面条,切菜、切肉,炒菜,然后拌一拌,总结一下就是你要一个做完才能做下一步。

async/await由三部分组成:调用方法、异步函数、await表达式。调用方法调用异步函数,异步函数包含await表达式。

1.异步语法

没有异步的普通做法,代码如下。

using System;
using System.Threading;

namespace AsyncMethod
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("这是第一行语句,正常输出");

            calc();

            Console.WriteLine("这行输出要等到calc()计算完成后才能显示,也是最后一行输出");

            Console.ReadKey();
        }

        static void calc()
        {
            Console.WriteLine("这里放置一个计算器,需要长时间计算");

            //这里没有防止计算代码,用线程睡眠代替。
            Thread.Sleep(5000);
            Console.WriteLine("这里的计算时间是5秒,程序会等待5秒");
            Console.WriteLine("计算完成。");
        }
    }
}

运行结果:

显然,程序运行到calc()方法阶段,因为calc()方法的大量计算需要时间,所以程序就一直再等待运行结果。只能等待calc()结果出来了才能继续执行下面的代码。

使用异步方法可以让程序继续执行,calc()计算结果出了再显示结果。不耽误去做别的事情。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace AsyncMethod
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("这是第一行语句,正常输出");

            calc();

            Console.WriteLine("这行输出要等到calc()计算完成后才能显示,也是最后一行输出");

            Console.ReadKey();
        }

        static async void calc()
        {
            Console.WriteLine("这里放置一个计算器,需要长时间计算");

            //这里没有防止计算代码,用线程睡眠代替。
            await Task.Run(() => Thread.Sleep(5000));
            
            Console.WriteLine("这里的计算时间是5秒,程序会等待5秒");
            Console.WriteLine("计算完成。");
        }


    }
}

 运行结果。

观察运行结果,程序中能输出的就先输出了,需要等待的就等计算完成再出来。

总结一下就是一句话,你先去搞,搞好了给我说一下。

2.WPF中演示异步。

控制台上演示就是缺点啥,反正就是搞不懂。用带图形界面演示就方便多了。最明显的表现就是程序遇到大量数据计算式程序界面会卡住。这就需要用异步编程来解决。

 向WPF设计器放置两个控件:一个button一个textbox一个label。将LABEL命名未label1

双击button,添加如下代码:

private void Button_Click(object sender, RoutedEventArgs e)
        {
            Thread.Sleep(5000);
            
        }

 运行程序。

这是没有使用异步编程的程序,当点击数据计算按钮后,程序后停止5秒,程序界面卡住,无法拖动,textbox也无法点击。

修改代码为异步模式。

private async void Button_Click(object sender, RoutedEventArgs e)
        {
            label1.Content = "程序开始计算,还没有计算完成";
            // Thread.Sleep(5000);
            await Task.Run(() => Thread.Sleep(5000));
            label1.Content = "计算完成";
        }

  再次运行程序,点击数据计算按钮,程序界面未卡住,可以拖动,也可以再textbox中编辑文字。

 

 

 

 

 

 

 

 

 

 

异步与多线程并不是同一个概念,多线程编程是实现异步的一种手段 同步异步更强调的是消息反馈机制,即调用后是否需要等待返回结果。

参考资料。

https://zhuanlan.zhihu.com/p/350816301

https://www.zhihu.com/question/58922017

https://www.jb51.net/article/235964.htm

https://www.cnblogs.com/mushroom/p/4575417.html

https://www.cnblogs.com/kiba/p/9292904.html

https://www.cnblogs.com/springsnow/p/13140601.html

https://www.cnblogs.com/s0611163/p/17076494.html

https://www.cnblogs.com/landeanfen/p/4734252.html

 pi算法

https://www.cnblogs.com/beimingdaoren/p/12482435.html

posted @ 2023-03-11 17:37  冲浪的奶糖  阅读(29)  评论(0编辑  收藏  举报