Task.ContinueWith BeginInvoke 未按预期工作
Task.ContinueWith with BeginInvoke not working as expected
考虑以下代码:
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 上执行此操作,单击按钮 2 时会得到以下输出:
task1 status:RanToCompletion
task2 status:WaitingToRun
即使我使用了 ContinueWith,这怎么可能?
我知道 BeginInvoke 只是让委托排队执行,如果我使用 Invoke 它工作得很好。这是错误还是干扰了 BeginInvoke?有任何想法吗?提前致谢。
我没有主要来源,但 this post 声明消息队列有 10,000 条记录的限制(Hans Passant 是本网站上 windows 表格最专家之一所以我相信他的话,即存在限制)。
因为您将 100,000 条记录放在那里,所以它要么将您的 ContinueWith 推离堆栈,要么一开始就没有添加到那里(我不确定是哪个)
考虑以下代码:
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 上执行此操作,单击按钮 2 时会得到以下输出:
task1 status:RanToCompletion
task2 status:WaitingToRun
即使我使用了 ContinueWith,这怎么可能?
我知道 BeginInvoke 只是让委托排队执行,如果我使用 Invoke 它工作得很好。这是错误还是干扰了 BeginInvoke?有任何想法吗?提前致谢。
我没有主要来源,但 this post 声明消息队列有 10,000 条记录的限制(Hans Passant 是本网站上 windows 表格最专家之一所以我相信他的话,即存在限制)。
因为您将 100,000 条记录放在那里,所以它要么将您的 ContinueWith 推离堆栈,要么一开始就没有添加到那里(我不确定是哪个)