• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

C#中await前后执行线程的问题

原作者: [db:作者] 来自: [db:来源] 收藏 邀请
 悬赏园豆:

今天有点疑惑就写了个测试的代码,发现控制台和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}\r\n");
}

输出:

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}\r\n");
}

输出:

Test.Before:1

Test.After:1

 

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

JoySn 初学一级 | 园豆:138
提问于:2018-08-15 20:21
 
其他回答(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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
二分查找的C语言实现发布时间:2022-07-14
下一篇:
C#判断数据类型的简单示例代码发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap