问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

C#中async和await的讲解

创作时间:
作者:
@小白创作中心

C#中async和await的讲解

引用
CSDN
1.
https://blog.csdn.net/qq_41375318/article/details/144289043

async和await是C#中用于简化异步编程的重要特性。它们的主要目的是降低编程难度,使开发者能够以同步编程的方式编写异步代码。本文将详细介绍async和await的设计目的、使用优点以及具体应用场景,并通过代码示例帮助读者更好地理解相关概念。

async和await的讲解

async和await是为降低编程难度设计的,所以本身是很简单的。

设计async和await的目的

顺序编程,不阻塞线程,降低编程难度(以同步编程的方式来写异步)。

优点:

  1. 避免回调地狱:传统的异步编程通常使用回调函数,这可能导致代码结构复杂,难以理解和维护。async 和 await 可以避免这种情况。
  2. 更好的错误处理:异步方法可以像同步方法一样使用 try-catch 块来处理异常
  3. 提高性能:通过异步编程,应用程序可以在等待I/O操作完成时继续执行其他任务,从而提高应用程序的响应性和吞吐量。
public static async void ShowMessageDialogByTime(string host, string title, string tipText, bool isQuestion)
{
    CommonDialogParams ps = new CommonDialogParams()
    { DialogHost = host, DialogTitle = title, DialogTipText = tipText, IsQuestion = isQuestion };
    DialogHost.Show(new CurcularProgressView(), host);
    try
    {
        await Task.Run(() =>
        {
            Thread.Sleep(1000);
        });
    }
    finally
    {
        // 执行完毕后,关闭窗口
        DialogHost.Close(host);
    }
}

使用注意:

  • async 声明为异步方法,不会阻塞,异步执行,不会阻塞当前线程
  • await 等同 task.wait(),await 会等待线程方法执行结束为止,直到 task 执行结束,才会执行下面的代码

带返回值的异步方法

public async Task test(string a)
{
    //await Console.WriteLine("同步的方法");
    Task<string> task = new Task<string>(() =>
    {
        return "hello";
    });
    await task;
}
private async void button1_Click(object sender, EventArgs e)
{
    await test("major");
}

返回Task的必须有await和return

public static async Task<object> ShowCurcularProgress(string host, Action action)
{
    // 显示窗口
    DialogHost.Show(new CurcularProgressView(), host);
    try
    {
        await Task.Run(() =>
        {
            action();
        });
        return new CommonDialogResult() { Button = CommonDialogButton.Ok };
    }
    finally
    {
        // 执行完毕后,关闭窗口
        DialogHost.Close(host);
    }
}

代码示例

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

namespace 异步async和await
{
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        // 该方法不会阻塞主线程
        public async void test2()
        {
            var task = Task.Run(() =>
            {
                Thread.Sleep(4000);
                MessageBox.Show("hello2222");
            });
            // await会等待线程方法执行结束为止, 直到task执行结束,才会执行MessageBox.Show("hello9999922");
            await task;
            MessageBox.Show("hello9999922");
        }

        private void btnclick(object sender, RoutedEventArgs e)
        {
            // 调用异步方法
            test2();
            MessageBox.Show("按钮点击了");
            // 同样效果
            //Action action = () =>
            //{
            //    Thread.Sleep(300000);
            //};
            //Task task2 = new Task(action);
            //task2.Start();  ===> Task.Run()
            // task.wait()  ==> await
        }
    }
}

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号