# 多线程
6 篇文章
C# 语言
C# 多线程(四):异步调用容易踩的坑
for 循环里 Task.Run 捕获循环变量,打印出来的全是错的;原因是闭包捕获的是变量本身而不是值。顺带补上另外几个常见的坑:界面线程上 .Result 死锁、async void 吞异常、忘记 await。
C# 语言C# 多线程(二):Thread
Thread 的前台与后台、启动、线程状态、Join 等待,以及为什么不该再用 Abort:.NET 5 以后它直接抛异常。改用 CancellationToken 或标志位让线程自己退出。
C# 语言C# 多线程(三):Thread 和 Task 怎么选
从创建管理、异步编程、返回值、异常、线程复用五个方面比较 Thread 和 Task,最后给一张上位机开发里的选型表。
C# 语言C# 多线程(一):Task
Task 的五种用法:后台执行、await 等待、WhenAll 并行、异常处理、CancellationToken 取消。顺带纠正原文里 new Task 包 async 方法导致 WhenAll 等不到的真正原因。
WinFormWinForm 加载界面卡死:UI 线程被堵住了
在 Main 里先 Show 一个加载窗体再做初始化,进度条和文字都不动。原因是消息循环还没跑起来。解决办法是让加载窗体在自己的线程里 Application.Run;同类问题「Show 之后窗体显示不全」也一并说清楚。
WinFormWinForm 窗体句柄什么时候创建,事件按什么顺序
new 一个窗体并不会创建窗口句柄,Show 或 Application.Run 时才会;这就是对刚 new 出来的窗体调用 Invoke 会报错的原因。附窗体显示和关闭的完整事件顺序。