C# ansyc/await/Task用法

C# ansyc/await/Task用法

注:Task要在.Net 4.5 环境下有效,似乎是因为:

从 C# 7 开始,返回另一个类型(通常为值类型),该类型具有 GetAwaiter 方法,可尽可能减少性能关键代码段中的内存分配。

测试代码1

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            YBCL();
            MessageBox.Show($"看看什么时候执行!");
        }

        private async void YBCL()
        {
            //await ybTest();
            Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(10000); MessageBox.Show($"任务进行中!"); });
            MessageBox.Show($"任务已完成!");
        }

        public Task ybTest()
        {
            Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000); });
            return t1;
        }

弹窗的先后顺序为
这里写图片描述
这里写图片描述
已完成->进行中->(点击“已完成”确定后)看看什么时候执行

也就是说,Task相当于开了一个线程,而后直接执行下一步的操作,点击完成后,又返回到最初的ButtonBase_OnClick函数去执行“看看什么时候执行”函数。线程结束后,自动弹出“任务进行中”。

测试代码1

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            YBCL();
            MessageBox.Show($"看看什么时候执行!");
        }

        //此处用await关键字
        private async void YBCL()
        {
            await ybTest();           
            MessageBox.Show($"任务已完成!");
        }

        public Task ybTest()
        {
            Task t1 = Task.Factory.StartNew(() => { Thread.Sleep(1000);MessageBox.Show($"任务进行中!");});
            return t1;
        }

弹窗的先后顺序为
这里写图片描述
这里写图片描述
看看什么时候执行->进行中->(点击“进行中”确定后)已完成

也就是说,事件触发后,调用了异步函数YBCL(),然后不等这个函数响应,直接跳过了整个函数。而在YBCL()中,await的作用是等待ybTest()函数运算完,才开始运算下面的函数。即:await下面的函数,需要等待await 的对象 完成后 才能继续运行。
而async函数外部的代码,则是与函数内部的代码分开了。

C#中,async/await是一种用于处理异步操作的关键字组合。它可以使代码更加简洁和易于理解,同时也提供了更好的性能和可维护性。 下面是一些C# async/await的复杂运用场景: 1. 并行执行多个异步任务:使用Task.WhenAll方法可以并行执行多个异步任务,并等待它们全部完成。例如: ```csharp public async Task DoMultipleTasksAsync() { Task task1 = Task.Run(() => DoTask1()); Task task2 = Task.Run(() => DoTask2()); Task task3 = Task.Run(() => DoTask3()); await Task.WhenAll(task1, task2, task3); } ``` 2. 异步任务的超时处理:使用Task.Delay和CancellationToken实现异步任务的超时处理。例如: ```csharp public async Task DoTaskWithTimeoutAsync() { var cts = new CancellationTokenSource(); cts.CancelAfter(TimeSpan.FromSeconds(5)); try { await Task.Delay(TimeSpan.FromSeconds(10), cts.Token); // 执行异步任务 } catch (OperationCanceledException) { // 超时处理逻辑 } } ``` 3. 异步任务的重试机制:使用循环和延迟重试策略来实现异步任务的重试。例如: ```csharp public async Task DoTaskWithRetryAsync() { int maxRetries = 3; int retryDelaySeconds = 5; for (int retryCount = 0; retryCount < maxRetries; retryCount++) { try { // 执行异步任务 await DoTaskAsync(); return; } catch (Exception) { // 异常处理逻辑 } await Task.Delay(TimeSpan.FromSeconds(retryDelaySeconds)); } // 重试次数超过限制的处理逻辑 } ``` 这些是C# async/await的一些复杂运用场景,希望对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

话与山鬼听

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

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

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

打赏作者

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

抵扣说明:

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

余额充值