请考虑以下代码:
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 status:RanToCompletion
task2 status:WaitingToRun
即使我使用了ContinueWith,这怎么可能?
我知道BeginInvoke只是将委托排队执行,如果我使用Invoke它就可以了。这是一个错误还是干扰了BeginInvoke?有任何想法吗?提前谢谢。
答案 0 :(得分:1)
我没有主要来源,但是this post声明消息队列有10,000个记录的限制(Hans Passant是此站点上用于Windows窗体的最专家之一,所以我相信他的这个词存在极限)。
因为你在那里放了100,000条记录,所以要么将你的ContinueWith从堆栈中推出,要么从来没有在那里添加(我不确定是哪一个)