qq_32461371 2021-04-16 15:32 采纳率: 0%
浏览 259

return Task.Run和return await Task.Run的区别?

我正在学习async和await,我创建了一个winform程序,并定义了3个按钮,按钮的代码如下:

        private async void button4_Click(object sender, EventArgs e)
        {
            SetTextBox($"button4_Click Start");
            int res = await Task.Run(() =>
            {
                Thread.Sleep(3000);
                return 4;
            });
            SetTextBox($"button4_Click End, {res}");
        }
        private async void button5_Click(object sender, EventArgs e)
        {
            SetTextBox($"button5_Click Start");
            int res = await func5();
            SetTextBox($"button5_Click End, {res}");
        }
        private async Task<int> func5()
        {
            return await Task.Run(() =>
            {
                Thread.Sleep(3000);
                return 5;
            });
        }
        private async void button6_Click(object sender, EventArgs e)
        {
            SetTextBox($"button6_Click Start");
            int res = await func6();
            SetTextBox($"button6_Click End, {res}");
        }
        private async Task<int> func6()
        {
            return await func6_1();
        }
        private async Task<int> func6_1()
        {
            return await Task.Run(() =>
            {
                Thread.Sleep(3000);
                return 6;
            });
        }
        private void SetTextBox(string msg)
        {
            Invoke(new Action(() => { textBox1.Text += $"{msg}\r\n"; }));
        }

三个按钮执行的方法不同,却得到了相同的效果。所以return Task.Run,return await Task.Run以及多次return await Task.Run的区别到底在哪里?还是说他们经过编译器优化之后会得到相同的代码??

  • 写回答

1条回答 默认 最新

  • CrisYoung 2021-04-16 20:23
    关注

    被async修饰的方法如果没有await,直接return Task.Run,那么Task内代码块会被同步执行,并不会异步。而加上await关键词之后,代码块会被异步执行,返回void或者TResult。题主列出的代码均采用了异步的方式,且sleep都是三秒,那么结果当然是一样的。

    评论

报告相同问题?

悬赏问题

  • ¥20 mysql架构,按照姓名分表
  • ¥15 MATLAB实现区间[a,b]上的Gauss-Legendre积分
  • ¥15 Macbookpro 连接热点正常上网,连接不了Wi-Fi。
  • ¥15 delphi webbrowser组件网页下拉菜单自动选择问题
  • ¥15 linux驱动,linux应用,多线程
  • ¥20 我要一个分身加定位两个功能的安卓app
  • ¥15 基于FOC驱动器,如何实现卡丁车下坡无阻力的遛坡的效果
  • ¥15 IAR程序莫名变量多重定义
  • ¥15 (标签-UDP|关键词-client)
  • ¥15 关于库卡officelite无法与虚拟机通讯的问题