async/await 与console(C#)

这篇具有很好参考价值的文章主要介绍了async/await 与console(C#)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

问题:

上一篇async/await 致WPF卡死问题(https://www.cnblogs.com/stephen2023/p/17725159.html),介绍主线程阻塞,async/await导致卡死问题,同样的代码在console下却并不会出现卡死。

        static Stopwatch sw = new Stopwatch();

        static void log(string message)
        {
            Console.WriteLine($"{sw.ElapsedMilliseconds}:{message} by Thread:{Thread.CurrentThread.ManagedThreadId}");
        }

        static void Main(string[] args)
        {
            sw.Start();
            log("Main() Started!");
            var t = getResult().Result;
            log($"got result:{t}");
            log("Main() is Ended!");
            Console.ReadKey();

        }

        public static async Task<int> getResult()
        {
            await Task.Delay(1000);
        log("get result is about to return");
            return 10;
        }

并且await后的任务也是由“新线程”执行的,并非主线程执行。

分析:

对于如下含await的代码

await FooAsync();
RestOfMethod();

可以类比于:

var t = FooAsync();
var currentContext = SynchronizationContext.Current;
t.ContinueWith(delegate
{
    if (currentContext == null)
        RestOfMethod();
    else
        currentContext.Post(delegate { RestOfMethod(); }, null);
}, TaskScheduler.Current);

WPF与Console不同的关键在于SynchronizationContext,对于WPF,继承了SynchronizationContextDispatcherSynchronizationContext 并重写了post方法,将委托任务交由UI线程处理,而console程序并没有,当前的SynchronizationContext为null,所以对于console程序await后续的任务任由执行await异步任务的线程执行,相当于上一篇的ConfigureAwait(false),主线程阻塞,并不会出现卡死现象。

 

 

 

翻译

搜索

复制文章来源地址https://www.toymoban.com/news/detail-712107.html

到了这里,关于async/await 与console(C#)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • C#中await /async 的使用场景,优点,使用方法介绍

      async/await  是 C# 中异步编程的关键特性,它使得异步代码编写更为简单和直观。下面深入详细描述了  async/await  的使用场景、优点以及一些高级使用方法,并提供了相应的实例源代码。 I/O 操作:  异步编程特别适用于涉及 I/O 操作(如文件读写、网络请求等)的场景。在

    2024年02月05日
    浏览(35)
  • async/await 在 C# 语言中是如何工作的?(下)

    接《async/await 在 C# 语言中是如何工作的?(上)》、《async/await 在 C# 语言中是如何工作的?(中)》,今天我们继续介绍 SynchronizationContext 和 ConfigureAwait。   ▌SynchronizationContext 和 ConfigureAwait 我们之前在 EAP 模式的上下文中讨论过 SynchronizationContext,并提到它将再次出现。

    2024年02月08日
    浏览(32)
  • Unity C# 之 Task、async和 await 结合使用的一些情况处理

    目录 Unity C# 之 Task、async和 await  结合使用的一些情况处理 一、简单介绍 二、把 async 函数,通过变化转为一般的函数 三、在 async 函数中,切换到主线程,并等待主线程执行完毕,继续 async 中的代码 Unity 在使用 Task 结合 async (await) 的时候,偶尔会遇到一些特殊情况,需要

    2024年01月22日
    浏览(30)
  • 深入探讨 C# 和 .NET 中 async/await 的历史、背后的设计决策和实现细节

    对 async/await 的支持已经存在了十多年。它的出现,改变了为 .NET 编写可伸缩代码的方式,你在不了解幕后的情况下也可以非常普遍地使用该功能。 从如下所示的同步方法开始(此方法是“ 同步的 ”,因为在整个操作完成并将控制权返回给调用方之前,调用方将无法执行任何

    2024年02月08日
    浏览(28)
  • Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理

    目录 Unity C# 之 Task、async和 await 、Thread 基础使用的Task的简单整理 一、Task、async和 await 、Thread 基础概念 1、线程,多线程 2、Task  3、async (await ) 二、Task 的基础使用,Task 的创建 和 启动 1、创建并运行一个Task 2、创建有返回值的 Task 3、Task提供了 task.RunSynchronously()用于同步

    2024年02月12日
    浏览(32)
  • C# 解决 https请求 ssl证书问题,看我一篇通通解决

    废话不多说,直接上代码,实干兴邦,空谈误国!光说不贴源代码更是耍流氓! 针对旧版本的接口框架,.netformwork4.5以下,加上传统的ssl机制即可解决问题。 针对.net core版本的框架,采用ssl证书验证回调的方式,其中方案二和方案三同属于一种解决方式,方案三的更直接明了

    2024年02月16日
    浏览(36)
  • Unity中的异步编程【5】——在Unity中使用 C#原生的异步(Task,await,async) - System.Threading.Tasks

    1、System.Threading.Tasks中的Task是.Net原生的异步和多线程包。 2、UniTask(Cysharp.Threading.Tasks)是仿照.Net原生的Task,await,async开发的一个包,该包专门服务于Unity,所以取名UnityTask,简称UniTask。 3、既然有Task了,为啥还要搞一个UniTask (1)Task可以用在PC和Android上,但是在WebGL上则会

    2023年04月17日
    浏览(37)
  • Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现

    目录 Unity C# 之 使用 HttpWebRequest 基础知识/HttpWebRequest 进行异步Post 网络访问/数据流形式获取数据(Task/async/await)的代码简单实现 一、简单介绍 二、实现原理 三、注意事项 四、效果预览 五、关键代码 附录 : HttpWebRequest 的一些基础知识 1、HttpWebRequest 常用属性 2、HttpWebRequest 

    2024年02月05日
    浏览(46)
  • 一文读懂异步和同步——async/await在运行时和普通代码的执行顺序的问题

    一、执行顺序问题 JavaScript中的await语句是异步编程中用于等待Promise对象执行结果的,它通常与async函数一起使用。在使用await时,程序的执行将暂停,直到该后面的Promise对象完成执行并返回结果。 函数代码执行顺序通常情况下按照代码所在文件从上至下

    2024年02月03日
    浏览(31)
  • async/await 的用法

    使用场景 在实际开发中,如果你遇到了等第一个请求返回数据完,再执行第二个请求(可能第二个请求要传的参数就是第一个请求接口返回的数据)这个问题。 代码 方法1: 方法2: 先请求接口1,获取到接口1返回结果后,将其作为接口2的参数,再去请求接口2 1、async 用于申明

    2024年02月07日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包