C# 异步方法返回值的问题

Blithe239 2017-07-18 04:02:29
// TASK EXAMPLE  
async Task Task_MethodAsync()
{
// The body of an async method is expected to contain an awaited
// asynchronous call.
// Task.Delay is a placeholder for actual work.
await Task.Delay(2000);
// Task.Delay delays the following line by two seconds.
textBox1.Text += String.Format("\r\nSorry for the delay. . . .\r\n");

// This method has no return statement, so its return type is Task.
}

上述的异步方法代码的返回类型是Task,但是函数里并没有return语句,请问函数的返回值是什么呢?是Task.Delay这个任务吗?如果一个异步方法中有多个await语句,那最后的返回值是什么?谢谢了。
...全文
1682 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
这就好像有人说什么“在js代码中调用asp.net代码”于是害了许多许多asp.net 初学者一样,其实为了欺骗初学者而编出来的一些容易理解的话,长期来看,是有害的,稍微复杂一点的编程设计和调试中就能看出浑浑噩噩地后果。 异步方法里边的代码只是你要编写的委托过程代码,而 Task_MethodAsync 过程代码完全是人家编译器生成的,并不需要你来编写。所以你写的代码根本就不是 Task_MethodAsync 方法本身的代码,你只是注册一个 Task_MethodAsync 需要调用的委托。
  • 打赏
  • 举报
回复 1
所有的 sync 方法的返回值都是 Task,即使你定义一个 Task<....> 的异步方法,其返回值也是 Task(Task<.....>就是 Task 的具体化子类)。而根本不是什么写在尖括号里边的类型的对象。 所以假设你说“async Task<int> Task_MethodAsync() 方法要返回 int”这其实就是逻辑错误了。 在异步方法里边,定义的是异步调用方法过程,而并不是这个方法本身的过程。编译器要根据你的代码,先产生一个返回 Task(或者 Task<.....>)类型对象的方法,然后这个方法在运行时才会去调用你声明在中间的那些方法。你写的代码并不是这个方法本身的最终的代码,你写的那些代码只是这个方法需要调用的委托内容。 实际上
async Task abc()
就相当于
void abc(Action callback)
async Task<int> abc
就相当于
void abc(Action<int> callback)
,async/await 语法是让你把异步回调代码用顺序代码的风格来写,但是它也制造了麻烦,使得不求甚解的人会越来越糊涂。
ilikeff8 2017-07-18
  • 打赏
  • 举报
回复
你可以自己定义一个返回类型,不指定,就等于没有返回值,void, 自身, 随便怎么定义都可以

        static void Main(string[] args)
        {
            Task<bool> task = Task.Factory.StartNew(new Func<bool>(() =>
            {
                return true;
            }));
            bool result = task.Result;

            Task task2 = Task_MethodAsync();
            task2.Start();

            // 无 result

            Task<string> task3 = Task_MethodAsync2();
            task3.Start();
            string result3 = task3.Result;

        }

        static async Task Task_MethodAsync()
        {
            // The body of an async method is expected to contain an awaited   
            // asynchronous call.  
            // Task.Delay is a placeholder for actual work.  
            await Task.Delay(2000);
            // Task.Delay delays the following line by two seconds.  
            //textBox1.Text += String.Format("\r\nSorry for the delay. . . .\r\n");
            // This method has no return statement, so its return type is Task.    
        }

        static async Task<string> Task_MethodAsync2()
        {
            await Task.Delay(2000);
            return "123";
        }
正怒月神 2017-07-18
  • 打赏
  • 举报
回复
你可以把单单的Task 看成 void Task<T> 支持返回值
雷诺兹 2017-07-18
  • 打赏
  • 举报
回复

111,105

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧