C#多线程开发-了解C#5.0 05

简介: C#多线程开发-了解C#5.0 05

前面一篇文章,了解了任务并行库。这是异步编程基础设施,它允许我们以模块化的方式设计程序,来组合不同的异步操作。


解决了以往线程之间传递消息难等问题,但是我们在阅读和编写此类程序时还是会觉得非常难理解程序的实际执行顺利,总感觉把主动权交给并行库,总觉得心里面没底。而且随着系统的不断扩大,业务的不断完善,了解程序的先后执行次序就变得很重要。


C#5.0


在C#5.0中,微软引入了一个全新的语言特性,异步函数。它是TPL之上的更高级别的抽象,真正简化了异步编程。


抽象隐藏了主要的实现细节,使得程序员无需考虑许多重要的事情,从而使异步编程更加容易。


   async Task<string> GetStringAsync() 
        {
            await Task.Delay(TimeSpan.FromSeconds(2));            
            return "你好,阿辉";           
        } 


一、async和await


  • 在async标识的方法体里面,如果没有await关键字出现,那么这种方法和调用普通的方法没什么区别。


  • 在async标识的方法体里面,在await关键字出现之前,还是主线程顺序调用执行,知道await关键字的出现才会出现线程阻塞。


  • await关键字可以理解为等待方法执行完毕,除了可以标记有async关键字的方法外还能标记Task对象,标识等待该线程执行完毕。所以await关键字并不针对于asyncd的方法,而是针对async方法所返回给我们的Task。


  • async方法的返回类型必须为void、Task或者Task类型,说白了,async要么是void,要么和Task关联。


在async方法外不能使用await关键字,否则编译错误。异步函数在代码中至少要拥有一个await操作符,如果没有,也不会报错,只是会提示警告。



在ASP.NET程序中,一旦在代码中使用了异步,最好一直使用。调用异步方法时,应该用await等待它返回Task对象,一定要避免使用Task.Wait或Task.Result方法,因为这两个方法会阻塞线程。


      public ActionResult DeadLock()
        {
            Task task = WaitAsync();
            //同步程序块,正在等待异步方法完成
            task.Wait();
            return Content("执行完毕");
        }
        async Task WaitAsync()
        {
            await Task.Delay(TimeSpan.FromSeconds(5));
        }



在DeadLock()方法中,当执行到task.Wait()方法时,主线程会被阻塞,不往下执行。等候WaitAsync()异步方法执行完毕后,才解除阻塞。


在C#5.0中,await和Async是有一定的限制的。


  • 不能把控制台中的Main()方法标记为async.


  • 不能在catch、finally、lock或unsafe代码块中使用await操作符。


  • 不允许对任何异步函数使用ref或out参数。


并不是所有的方法都得上Async的,对于需要异步处理的该使用async/await就使用,不需要的就使用平常方法。平常的方法在性能方面要比async关键字方法块40~50倍。所以我们在平时也要注意不能滥用async。


二、使用await操作符获取异步任务结果


    async static Task WithWait() 
        {
            try
            {
                string result = await GetInfoAsync("阿辉");
                Console.WriteLine(result);                     
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        async static Task<string> GetInfoAsync(string name)
        {
            await Task.Delay(TimeSpan.FromSeconds(2));
            return name+",你好。";            
        }
        Task t = WithWait();
        t.Wait();


这样就可以获取到异步任务的返回值了。使用await后,C#立即创建了一个任务,其有一个后续操作任务,包含了await操作符后面的所有剩余代码。这个新任务也处理了异常传播。然后将任务返回到主方法中并等待其完成。


目前在最新的.NET Core中,基本上所有方法都默认在使用await/async这种模式来编写。所以学习这种异步编程方式还是特别有意义的。


好了,今天的学习就到这里,我们下篇文章见。



目录
相关文章
|
29天前
|
数据采集 XML JavaScript
C# 中 ScrapySharp 的多线程下载策略
C# 中 ScrapySharp 的多线程下载策略
|
8天前
|
API Android开发 iOS开发
安卓与iOS开发中的线程管理对比
【9月更文挑战第12天】在移动应用的世界中,安卓和iOS平台各自拥有庞大的用户群体。开发者们在这两个平台上构建应用时,线程管理是他们必须面对的关键挑战之一。本文将深入探讨两大平台在线程管理方面的异同,通过直观的代码示例,揭示它们各自的设计理念和实现方式,帮助读者更好地理解如何在安卓与iOS开发中高效地处理多线程任务。
|
2天前
|
安全 数据库连接 API
C#一分钟浅谈:多线程编程入门
在现代软件开发中,多线程编程对于提升程序响应性和执行效率至关重要。本文从基础概念入手,详细探讨了C#中的多线程技术,包括线程创建、管理及常见问题的解决策略,如线程安全、死锁和资源泄露等,并通过具体示例帮助读者理解和应用这些技巧,适合初学者快速掌握C#多线程编程。
16 0
|
24天前
|
JSON C# 开发者
💡探索C#语言进化论:揭秘.NET开发效率飙升的秘密武器💼
【8月更文挑战第28天】C#语言凭借其强大的功能与易用性深受开发者喜爱。伴随.NET平台演进,C#持续引入新特性,如C# 7.0的模式匹配,让处理复杂数据结构更直观简洁;C# 8.0的异步流则使异步编程更灵活高效,无需一次性加载全部数据至内存。通过示例展示了模式匹配简化JSON解析及异步流实现文件逐行读取的应用。此外,C# 8.0还提供了默认接口成员和可空引用类型等特性,进一步提高.NET开发效率与代码可维护性。随着C#的发展,未来的.NET开发将更加高效便捷。
39 1
|
1月前
|
安全 测试技术 调度
iOS开发-多线程编程
【8月更文挑战第12天】在iOS开发中,属性的内存管理至关重要,直接影响应用性能与稳定性。主要策略包括:`strong`(强引用),保持对象不被释放;`weak`(弱引用),不保持对象,有助于避免循环引用;`assign`(赋值),适用于基本数据类型及非指针对象类型;`copy`(复制),复制对象而非引用,确保不变性。内存管理基于引用计数,利用自动引用计数(ARC)自动管理对象生命周期。此外,需注意避免循环引用,特别是在block中。最佳实践包括理解各策略、避免不必要的强引用、及时释放不再使用的对象、注意block中的内存管理,并使用工具进行内存分析。正确管理内存能显著提升应用质量。
|
21天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
47 0
|
21天前
|
开发者 iOS开发 C#
Uno Platform 入门超详细指南:从零开始教你打造兼容 Web、Windows、iOS 和 Android 的跨平台应用,轻松掌握 XAML 与 C# 开发技巧,快速上手示例代码助你迈出第一步
【8月更文挑战第31天】Uno Platform 是一个基于 Microsoft .NET 的开源框架,支持使用 C# 和 XAML 构建跨平台应用,适用于 Web(WebAssembly)、Windows、Linux、macOS、iOS 和 Android。它允许开发者共享几乎全部的业务逻辑和 UI 代码,同时保持原生性能。选择 Uno Platform 可以统一开发体验,减少代码重复,降低开发成本。安装时需先配置好 Visual Studio 或 Visual Studio for Mac,并通过 NuGet 或官网下载工具包。
26 0
|
21天前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
53 0
|
22天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。