在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
悬赏园豆:
今天有点疑惑就写了个测试的代码,发现控制台和Winform中不一样 比如: 控制台: ...Main(){ Test(); } private static async void Test() private static void Show(string str) 输出: Test.Before:1 Test.Task:3 Test.After:3
Winform中: ...test(){ Test(); } private async void Test() { Show("Test.Before"); } public void Show(string str) 输出: Test.Before:1 Test.After:1
为什么这两个不一样呢?新手求解答 最佳答案
-1
对于当前运行的winform程序,始终只有一个UI线程 收获园豆:20
那在控制台中,Task.Run里不是开了一个子线程3吗?await结束后也是3执行的。主要是疑惑为什么控制台中await结束后线程不是1,而是子线程3 @JoySn: 控制台程序没有主线程,程序跟着线程跑,启动线程3,就在一直在线程3里跑,除非再创建新的线程 @JoySn: 所以在控制台程序中同步方法中调用异步方法不会发生死锁 其他回答(2)
0
因为调用 Task 的 Run 之后返回的是 Task 在等待 Task 的时候可以设置 ConfigWait() 参数,通过这个参数可以设置之后是否返回主线程。
在控制台使用的时候,因为控制台没有 dispatcher 调度,所以在执行 Task 的run 等待就会发现当前的调度就是 Task 所在的线程,所以在控制台就是在创建 Task 的线程
在 WinForm 因为有主线程,所以从 Task 的 run 方法可以回到主线程
Show("Test.Before"); Test.Before:1 Test.After:1
Show("Test.Before");
Test.Before:1 Test.After:3 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论