2016-11-11 24 views
0

我有两个任务需要同时执行,并且顶级任务在其子节点结束时结束。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依次运行任务。

回答

0

您的锁定可能是由UI更改实现引起的。 我可以使用这个来实现相同的使用任务;

var context = TaskScheduler.FromCurrentSynchronizationContext(); 
      var parent = Task.Factory.StartNew(() => { 

      Task.Delay(40000); 
       MessageBox.Show("From Parent"); 
      var child = Task.Factory.StartNew(() =>{ 
       MessageBox.Show("From Child"); 
       Task.Delay(30000); 
       Text = "Title change from Child"; 
      }); 
      }, CancellationToken.None, TaskCreationOptions.AttachedToParent, context); 

编辑:请参阅下面的问候EVK注释下面的语句

此外,如果您使用的框架4.5,我建议使用Task.Run代替Task.Factory.StartNew ...查看https://blogs.msdn.microsoft.com/pfxteam/2011/10/24/task-run-vs-task-factory-startnew/更多详细信息

+0

请注意,在这种特殊情况下,关于Task.Run的建议并不是很好,因为Task.Run会使用选项DenyChildAttach调用StartNew,因此实际上会阻止附加子任务。 – Evk

+0

谢谢Evk。我今天学到了一些新东西:-) – Sammy

+0

我试过你的代码无济于事 - 它锁定了UI线程:( 如果我取消CancellationToken.None和上下文,UI线程不会被锁定,但子任务不会执行,就像以前一样 难道是从事件处理程序引发这些问题开始这些任务吗? –