【发布时间】:2016-01-04 18:51:32
【问题描述】:
考虑以下代码:
Task task1;
Task task2;
private void button1_Click(object sender, EventArgs e)
{
task1 = Task.Run(() =>
{
for (int i = 0; i < 100000; i++)
{
BeginInvoke(new Action<int>((int n) =>
{
listView1.Items.Add(n.ToString());
}), i);
}
});
task2 = task1.ContinueWith(t =>
{
MessageBox.Show("Why isn't this reached");
}, TaskScheduler.FromCurrentSynchronizationContext());
}
private void button2_Click(object sender, EventArgs e)
{
MessageBox.Show(String.Format("task1 status:{0}\r\ntask2 status:{1}", task1.Status, task2.Status));
}
如果我在 Windows 8 .NET Framework 4.5.2 上运行它,当我单击 button2 时会得到以下输出:
task1 状态:RanToCompletion
task2 状态:WaitingToRun
即使我使用了 ContinueWith,这怎么可能?
我知道 BeginInvoke 只是将委托排入队列以执行,如果我使用 Invoke 它工作得很好。这是一个错误还是干扰了 BeginInvoke?有任何想法吗?提前致谢。
【问题讨论】:
-
您正在淹没消息队列,也许您需要等待更长的时间才能点击按钮 2,直到您在 listblox 中看到 100000 时才单击它。那它有用吗?
-
不,它与此无关,task2 永远不会被调用。但是,如果我使用较慢的上限,因为我喜欢 100 而不是 100000,它会被调用就好了。难道是windows消息泵超载了?但是它确实添加了所有 100000 个项目,这很奇怪..