具有BeginInvoke的Task.ContinueWith无法按预期工作

时间:2016-01-04 18:51:33

标签: c# task

请考虑以下代码:

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?有任何想法吗?提前谢谢。

1 个答案:

答案 0 :(得分:1)

我没有主要来源,但是this post声明消息队列有10,000个记录的限制(Hans Passant是此站点上用于Windows窗体的最专家之一,所以我相信他的这个词存在极限)。

因为你在那里放了100,000条记录,所以要么将你的ContinueWith从堆栈中推出,要么从来没有在那里添加(我不确定是哪一个)