我有两个任务需要同时执行,并且顶级任务在其子节点结束时结束。C#Attachedchild任务从不执行
对于更多的背景,子任务执行冗长的查询,外部任务在UI上显示计数器(通过调用),以便用户知道发生了什么。当子任务完成时,它会用结果更新UI,并且在那时不再需要计数器(父任务)。但是,当任务开始时,只有父任务开始,子任务从不执行。顺便说一句,我没有使用BackgroundWorker,因为我需要能够同时执行多个查询/计数器。
的任务开始在一个DataGridView click事件:
private void hostMgmtDataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var parent = Task.Factory.StartNew(() =>
{
showTimer(e.ColumnIndex, e.RowIndex, 0);
var child = Task.Factory.StartNew(() =>
{
winUpdate(hostMgmtDataGridView.Rows[e.RowIndex].Cells[1].Value.ToString(), e.ColumnIndex, e.RowIndex);
},TaskCreationOptions.AttachedToParent);
});
}
这句法是从下面的文章采取:https://msdn.microsoft.com/en-us/library/dd997417(v=vs.100).aspx
如果我添加parent.Wait();正如上面文章中所描述的那样,整个UI线程都会锁定,这不是一个理想的结果。
任何建议,将不胜感激。
编辑:在parent.Wait
var parent = Task.Factory.StartNew(() =>
{
debugLabel1.Invoke(new Action(() => debugLabel1.Text = "parent starting"));
var child = Task.Factory.StartNew(() =>
{
debugLabel2.Invoke(new Action(() => debugLabel2.Text = "child starting"));
Thread.SpinWait(5000000);
debugLabel2.Invoke(new Action(() => debugLabel2.Text = "child stopped"));
},TaskCreationOptions.AttachedToParent);
});
parent.Wait();
debugLabel1.Text = "parent stopped";
再次,如果我离开()在UI线程锁了起来: 我使用的示例代码从文章试图(改编一点点我的表格) 。如果我取出Wait语句,“父停止”不会显示,但“孩子停止”会显示。
经过进一步阅读,许多人都建议使用“ContinueWith”,但我需要两个任务同时运行,Continuation依次运行任务。
请注意,在这种特殊情况下,关于Task.Run的建议并不是很好,因为Task.Run会使用选项DenyChildAttach调用StartNew,因此实际上会阻止附加子任务。 – Evk
谢谢Evk。我今天学到了一些新东西:-) – Sammy
我试过你的代码无济于事 - 它锁定了UI线程:( 如果我取消CancellationToken.None和上下文,UI线程不会被锁定,但子任务不会执行,就像以前一样 难道是从事件处理程序引发这些问题开始这些任务吗? –