WPF中SwitchToMainThreadAsync与主线程重入:MethodTest执行后_listTest内容是否确定?
问题解答
结论
执行MethodTest后,_listTest的内容必然是[1, 2, 3],不存在Method2()执行前Method3()完成的极端场景。
原因分析
- UI线程是单线程模型,同步方法
MethodTest在执行过程中会独占UI线程,直到整个方法执行完毕,才会开始处理消息队列中的其他任务。 - 调用
Method3()时,代码执行到await TaskScheduler.Default会将后续逻辑(切换回UI线程、添加元素3)调度到线程池,但此时UI线程仍在执行MethodTest的后续代码(调用Method2()),完全没有空闲处理切换回UI线程的请求。 ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync()的核心逻辑是等待UI线程释放出执行资源,只有当MethodTest执行完成、UI线程回到消息循环时,才会执行_listTest.Add(3)这一步。- 最终的执行顺序是严格固定的:
Method1()(添加1)→Method3()启动但挂起→Method2()(添加2)→ UI线程空闲后执行Method3()的后续逻辑(添加3),因此_listTest的内容只会是[1, 2, 3]。
内容的提问来源于stack exchange,提问作者Tomingsun
相关产品推荐
相关产品推荐

