1
4
NET框架中Win32消息泵送的确切细节没有记录。注意,Win32 API历史上允许重入行为。
当代码启动任务时,它使用的任务调度程序将请求在当前
这个
当代码继续调用
|
2
4
我猜会发生什么:
因此,创建新消息框窗口的行为可能会给任务一个先执行的机会。如果您改为执行Debug.WriteLine和Thread.Sleep,您可能会看到相反的结果:Sleep将首先发生(因为您没有泵送消息),然后Task将运行。
编辑:
根据评论,OP的行为发生在调用
我想我走对了——
|
3
0
好吧,让我们把事实说清楚。
如果我再加一个
很明显,“Exit!”是“Task!”表单的模态,而不是我们的父级。换句话说,第二个消息框以某种方式“在第一个消息框的上下文中”运行。
这与我在最初的回答中谈到的内容有关。模态框
盗窃
它运行的线程,并处理消息泵送。当第二次
如果我们使用
这些表单依赖于windows消息传递。模态形式“窃取”其所有者的句柄,并处理这些消息。只有在消息框关闭后,WM才会发送给父级(一个简单的“设置焦点”消息)。
然而
仍然存在的谜团是为什么任务在
这让我们进入了大结局: 我们创造了我们的小任务。然而,它有一个windows窗体同步上下文,所以它不做任何事情,而是简单地将任务添加到窗体上的队列中。这是在队列的顶部,因此一旦我们解除对UI线程的控制,它就会立即执行。 如果我们在显示“退出!”对话框之前等待,那么一切都是清楚的-首先显示“任务!”,在某个时刻(因为它没有通过消息队列),“退出。
如果我们不等待
总而言之,另一个不让UI线程上的事情复杂化的好理由。看起来
实际上,您将在UI线程之外运行任务,只有需要访问UI的继续部分才会在UI线程中。尽管如此,如何
|
altwood · 任务未完成时[复制] 6 年前 |
SharmaPattar · 包含和不包含异步[重复]的任务返回类型 7 年前 |
Tobi · 聚合和连接(内部、外部、左侧,…)使用TPL数据流? 7 年前 |
nicks · 可以在不同的线程上等待任务完成吗?[副本] 7 年前 |