C#中async/await之线程上下文工作原理

首先让我们来了解一下async/await在C#中的基本概念和原理。

什么是async/await?

async/await是C#中异步编程的关键字,是一种改进了的异步编程模型。它基于任务(Task)和协程(Coroutine),通过简明的语法糖,使得异步编程变得更加易于理解和使用。

它的核心思想是将异步操作打包成一个任务(Task),在需要时使用await关键字暂停当前线程,等待该任务执行完成后再继续执行下面的代码。

异步/同步上下文

在C#中,异步代码和同步代码运行在不同的上下文中,异步操作将在一些特定的上下文中运行,比如UI线程、ASP.NET线程等,这些上下文被称为SynchronizationContext。同步代码的上下文是线程池或者 ThreadPool。

异步/同步上下文的切换机制大大影响了程序的性能和质量。如果上下文切换的代价太高,异步编程的优势就无法体现。

await的工作原理

当程序遇到一个await关键字的时候,它会将当前状态保存下来,并将控制流递交给SynchronizationContext,当异步任务完成后,SynchronizationContext会通知程序,将保存的状态恢复并执行下面的代码。

此处也需要注意:在异步任务完成后,它应该是运行在另一个上下文中,即异步上下文,为了确保这个异步任务在异步上下文中运行,开发者需要在异步操作函数最开始加上ConfigureAwait(false)。

示例说明

下面演示一下async/await在C#中的应用,这里我们使用一个简单的例子,获取指定url的html内容。

public async Task<string> GetHtmlAsync(string url)
{
    using (var httpClient = new HttpClient())
    {
        var html = await httpClient.GetStringAsync(url).ConfigureAwait(false);
        return html;
    }
}

在这个代码片段中,我们生成一个HttpClient实例,调用GetStringAsync方法获取目标url的html内容,并在字符串后面加上ConfigureAwait(false)。在这里ConfigureAwait(false)的作用是告诉程序,这个异步操作不需要回到原本的上下文中去。

下面我们在Console程序里面调用该方法,观察异步线程上下文的切换。

static async Task Main(string[] args)
{
    Console.WriteLine($"Main Start,ThreadId: {Thread.CurrentThread.ManagedThreadId}");

    var html = await GetHtmlAsync("https://www.baidu.com");
    Console.WriteLine($"Html length: {html.Length},ThreadId: {Thread.CurrentThread.ManagedThreadId}");

    Console.WriteLine("Main End");
}

在这个代码片段中,我们使用await关键字调用GetHtmlAsync异步方法,观察在await后面的代码在哪个线程上执行。我们可以看到,在GetHtmlAsync方法中的await后面的代码运行在了不同的线程上。

通过上述示例,我们可以了解到async/await在C#中的工作机制和应用场景,更多线程相关知识可以参考C#官方文档,深入了解异步编程。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中async/await之线程上下文工作原理 - Python技术站

(0)
上一篇 2023年6月6日
下一篇 2023年6月6日

相关文章

  • asp.net下比较两个等长字符串是否含有完全相同字符(忽略字符顺序)

    要在ASP.NET下比较两个等长字符串是否含有完全相同的字符(忽略字符顺序),一种方法是对每个字符串进行排序,然后将结果进行比较。下面是具体的步骤。 第一步:定义比较函数 首先,我们需要定义一个比较函数。这个函数用于对字符串进行排序,并将排序结果作为函数的返回值。 public string SortString(string s) { char[] ca …

    C# 2023年6月7日
    00
  • jQuery ajax仿Google自动提示SearchSuggess功能示例

    下面我将为你讲解“jQuery ajax仿Google自动提示SearchSuggess功能示例”的完整攻略。 简介 在网页中,我们经常需要使用搜索框来搜索一些内容,但是当我们输入关键词时,往往会出现一些自动提示,比如Google搜索框中的SearchSuggess功能。这种功能可以帮助我们更快地找到自己需要的信息,提高了搜索效率。本文将讲述如何使用jQue…

    C# 2023年5月31日
    00
  • C# String.Compare()方法: 比较两个字符串,返回比较结果

    C#中的String.Compare() Compare() 方法是C#中 string 类的成员方法之一,它用于比较两个字符串,并返回一个整数值来表示它们之间的关系。在比较字符串时,该方法会将文本视为由独立的字符组成的序列,而不是单个字符串。 下面是该方法的语法: public static int Compare(string strA, string …

    C# 2023年4月19日
    00
  • ASP.NET Core MVC 从入门到精通之HttpContext

    随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生,或其他想从事ASP.NET Core MVC 系统开发的人员。 经过前几篇文章的讲解,初步了解ASP.NET Core MVC项目创建,启…

    C# 2023年5月4日
    00
  • C#实现计算年龄的简单方法汇总

    C# 实现计算年龄的简单方法汇总 在开发中,经常需要计算一些日期相关的内容,其中计算年龄可以说是比较重要的一个需求。本文将介绍在C#中实现计算年龄的几种简单方法。 方法一:使用DateTime.Now和DateTime的Subtract方法计算年龄 这种方法的思想是通过当前时间和出生日期之间的时间差来计算年龄,代码如下: DateTime birthDay …

    C# 2023年6月1日
    00
  • 深入理解C#中的扩展方法

    深入理解C#中的扩展方法 什么是扩展方法 在C#语言中,扩展方法是指一种特殊类型的静态方法,这些方法可以被添加到已经存在的类型上,而不需要修改该类型的源代码。 扩展方法的语法 扩展方法有以下几个语法要素: 扩展方法必须定义在静态类中; 扩展方法必须是一个静态的方法; 在方法的第一个参数中加上this关键字,用于指定扩展方法的定义类型; 扩展方法的命名约定一般…

    C# 2023年5月15日
    00
  • C#泛型运作原理的深入理解

    C#泛型运作原理的深入理解 C#中的泛型是一种能够在编译时期实现类型安全和可重用性的技术,使用泛型可以提高代码的可读性、可维护性和灵活性,因此对于开发大型应用程序来说具有非常重要的意义。下面分为三个部分来详细介绍C#泛型的运作原理。 常规类型与泛型类型 C#中的类型可分为两类:常规类型和泛型类型。 常规类型常规类型是指在编译时期就已经确定数据类型的类型,例如…

    C# 2023年5月15日
    00
  • 用.NET创建Windows服务的方法

    创建 Windows 服务是一个很有用的技能,它可以让你在 Windows 系统上运行后台进程,例如,你可以创建一个 Windows 服务来运行一个定时备份进程或者监控某个特定的文件夹。下面是创建 Windows 服务的方法: 1. 准备工作 在开始之前,你需要安装以下工具: Microsoft Visual Studio Microsoft .NET Fr…

    C# 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部