首页新闻找找看学习计划

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

0
悬赏园豆:20 [已解决问题] 解决于 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}\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的主页 JoySn | 初学一级 | 园豆:138
提问于:2018-08-15 20:21
< >
分享
最佳答案
-1

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

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

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

JoySn | 园豆:138 (初学一级) | 2018-08-15 20:48

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

dudu | 园豆:39113 (高人七级) | 2018-08-15 20:57

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

dudu | 园豆:39113 (高人七级) | 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

 

欢迎看我的博客 [C# Task.Run 和 Task.Factory.StartNew 区别](https://lindexi.gitee.io/post/C-Task.Run-%E5%92%8C-Task.Factory.StartNew-%E5%8C%BA%E5%88%AB.html )

lindexi | 园豆:202 (菜鸟二级) | 2018-08-15 20:49
0

C#语法——await与async的正确打开方式

https://www.cnblogs.com/kiba/p/9292904.html

kiba518 | 园豆:170 (初学一级) | 2018-08-16 08:41
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册