C#中如果用await关键字来await一个为null的Task对象会抛出异常
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C#中如果用await关键字来await一个为null的Task对象会抛出异常,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2176字,纯文字阅读大概需要4分钟。
内容图文
![C#中如果用await关键字来await一个为null的Task对象会抛出异常](/upload/InfoBanner/zyjiaocheng/850/bb7fbe5048d3445aaa1d27ae632f61fb.jpg)
await & async模式是C#中一个很重要的特性,可以用来提高异步程序(多线程程序)的执行效率。但是如果尝试用await关键字来await一个为null的Task对象,会导致程序抛出NullReferenceException异常。
新建一个.NET Core控制台项目,贴入如下代码:
using System; using System.Threading; using System.Threading.Tasks; namespace AwaitNull { class Program { /// <summary> /// AwaitNullTask方法中的代码会await一个为null的Task t,这样做会抛出NullReferenceException异常 /// </summary> static async Task AwaitNullTask() { Task t = null;//声明一个为null的Task对象t try { await t;//await为null的Task对象t,会导致这里抛出NullReferenceException异常 Console.WriteLine($"Thread id <{Thread.CurrentThread.ManagedThreadId}> : Await finished...");//由于上面抛出了异常,这里的Console.WriteLine不会被执行 } catch(NullReferenceException e) { //输出异常信息 Console.WriteLine($"Thread id <{Thread.CurrentThread.ManagedThreadId}> : AwaitNullTask threw Exception : {e.GetType().ToString()}"); Console.WriteLine($"Thread id <{Thread.CurrentThread.ManagedThreadId}> : Exception message : {e.Message}"); throw;//catch后继续抛出NullReferenceException异常到AwaitNullTask方法的外部 } } static void Main(string[] args) { Task taskReturned = AwaitNullTask();//很有意思的是虽然AwaitNullTask方法内部抛出了NullReferenceException异常,但是其并不会影响AwaitNullTask方法外部的方法,就好像AwaitNullTask方法是在另外一个线程上执行的一样,但是本例中我们没有用Task来启动任何线程,可以看到本例中所有Console输出的信息中Thread id都相同,是在同一个线程上 Console.WriteLine($"Thread id <{Thread.CurrentThread.ManagedThreadId}> : taskReturned status is : {taskReturned.Status.ToString()}");//输出AwaitNullTask方法返回的Task对象taskReturned的Status,由于AwaitNullTask方法内部抛出了异常,所以Task对象taskReturned的Status为Faulted Console.WriteLine(); Console.WriteLine($"Thread id <{Thread.CurrentThread.ManagedThreadId}> : Press any key to quit..."); Console.ReadKey(); } } }
输出结果如下:
我们可以看到AwaitNullTask方法中由于await了一个为null的Task对象,抛出了NullReferenceException异常,但是有意思的是,AwaitNullTask方法表现出的行为是貌似运行在另一个线程上一样,其抛出的NullReferenceException异常并不会影响到Main方法,但实际上Main方法和AwaitNullTask方法都是由同一个线程运行的。
内容总结
以上是互联网集市为您收集整理的C#中如果用await关键字来await一个为null的Task对象会抛出异常全部内容,希望文章能够帮你解决C#中如果用await关键字来await一个为null的Task对象会抛出异常所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。