由于““是返回“Task”的异步方法,因此返回关键字不能后接对象表达式。是否要返回“Task<T>” 错误说明和解决方案

错误描述:

错误CS1997 由于“LoadEquipInfoService.LoadDesc()”是返回“Task”的异步方法,因此返回关键字不能后接对象表达式。是否要返回“Task<T>”

原因及解决方案分析:

在使用async/await异步方法时,如果方法里面如果没有返回值,默认返回一个Task,其表示该异步方法无返回值。

无返回值的情况下, async Task 等同于async void,两者间的区别是:异步函数签名为async Task(Task<T>)时,函数调用处可以使用await Task.WhenAny(), await Task.WhenAll() 等方式组合使用;而Async Void 则不行。

在调用其他异步函数的 主函数结尾处返回时,可以 await Task.WhenAny(), await Task.WhenAll() ,await Task.CompletedTask 来处理。

接收异步方法的task一般可以这样处理:

1、阻塞式

private async static Task Test()
        {
            Console.WriteLine($"当前主线程id={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            {
              Task t = NoReturnTask();
              t.Wait();//主线程等待Task的完成  阻塞的【调用Task.Wait()              Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");             }
            Console.Read();
        }

2、非阻塞

private async static Task Test()
        {
            Console.WriteLine($"当前主线程id={Thread.CurrentThread.ManagedThreadId.ToString("00")}");
            {
              Task t = NoReturnTask();
             await t;//await后的代码会由线程池的线程执行  非阻塞
             Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");
            }
            Console.Read();
        }

结果与上面的一致。是因为当主线程执行Test()方法中await t后,返回Test()调用处继续往下执行。Test()方法中Task t = NoReturnTask()在await之前,所以会先执行完毕(虽然开启的是一个子线程),此时test里面的

Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");

等同于

t.ContinueWith(t =>

{Console.WriteLine($"Main Thread Task ManagedThreadId={Thread.CurrentThread.ManagedThreadId}");});

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值