zoukankan      html  css  js  c++  java
  • C# 中await前后执行线程的问题

     悬赏园豆:20 [已解决问题] 浏览: 1763次 解决于 2018-08-15 22:43 

    今天有点疑惑就写了个测试的代码,发现控制台和Winform中不一样

    比如:

    控制台:

    ...Main(){  Test(); }

    private static async void Test()
    {
    Show("Test.Before");
    await Task.Run(() => { Thread.Sleep(2000); Show("Test.Task"); });
    Show("Test.After");//输出字符串和当前线程
    }

    private static void Show(string str)
    {
    Console.WriteLine($"{str}:{Thread.CurrentThread.ManagedThreadId} ");
    }

    输出:

    Test.Before:1

    Test.Task:3

    Test.After:3

    Winform中:

    ...test(){ Test(); }

    private async void Test()

    {

    Show("Test.Before");
    await Task.Run(() => { Thread.Sleep(2000); });
    Show("Test.After");//输出字符串和当前线程

    }

    public void Show(string str)
    {
    richTextBox1.AppendText($"{str}:{Thread.CurrentThread.ManagedThreadId} ");
    }

    输出:

    Test.Before:1

    Test.After:1

    为什么这两个不一样呢?新手求解答

    JoySn的主页JoySn 初学一级 | 园豆:138
    提问于:2018-08-15 20:21
     
    最佳答案
    -1

    对于当前运行的winform程序,始终只有一个UI线程

    收获园豆:20
    回复 dudu 高人七级 |园豆:38806 | 2018-08-15 20:46

    那在控制台中,Task.Run里不是开了一个子线程3吗?await结束后也是3执行的。主要是疑惑为什么控制台中await结束后线程不是1,而是子线程3

    支持(0)反对(0)回复 JoySn | 园豆:138 (初学一级) | 2018-08-15 20:48

    @JoySn: 控制台程序没有主线程,程序跟着线程跑,启动线程3,就在一直在线程3里跑,除非再创建新的线程

    支持(0)反对(0)回复 dudu | 园豆:38806 (高人七级) | 2018-08-15 20:57

    @JoySn: 所以在控制台程序中同步方法中调用异步方法不会发生死锁

    支持(0)反对(0)回复 dudu | 园豆:38806 (高人七级) | 2018-08-15 21:01
    其他回答(2)
    0

    因为调用 Task 的 Run 之后返回的是 Task 在等待 Task 的时候可以设置 ConfigWait() 参数,通过这个参数可以设置之后是否返回主线程。

    在控制台使用的时候,因为控制台没有 dispatcher 调度,所以在执行 Task 的run 等待就会发现当前的调度就是 Task 所在的线程,所以在控制台就是在创建 Task 的线程

    在 WinForm 因为有主线程,所以从 Task 的 run 方法可以回到主线程

    Show("Test.Before");
    await Task.Run(() => { Thread.Sleep(2000); }).ConfigureAwait(true);
    Show("Test.After");

    Test.Before:1

    Test.After:1

    Show("Test.Before");
    await Task.Run(() => { Thread.Sleep(2000); }).ConfigureAwait(false);
    Show("Test.After");

    Test.Before:1

    Test.After:3

  • 相关阅读:
    香港2013迷你制汇节即将启幕
    neuroph轻量级神经网络框架
    java如何实现python的urllib.quote(str,safe='/')
    python 的日志logging模块
    Python 代码使用pdb调试技巧
    python中reload(module)的用法,以及错误提示
    Notepad++如何取消打开最近的历史文件
    机器学习--入门答疑
    计算机的启动过程
    缓存设计
  • 原文地址:https://www.cnblogs.com/bruce1992/p/14108000.html
Copyright © 2011-2022 走看看