c# attachdchild任务永远不会执行

本文关键字:执行 永远 attachdchild 任务 | 更新日期: 2023-09-27 18:17:42

我有两个任务需要同时执行,顶级任务在其子任务结束时结束。

更多的背景,子任务正在执行一个冗长的查询,外部任务在UI上显示一个计数器(通过调用),以便用户知道正在发生一些事情。当子任务完成时,它用结果更新UI,此时不再需要计数器(父任务)。但是,当任务启动时,只有父任务启动,子任务永远不会执行。顺便说一句,我没有使用BackgroundWorker,因为我需要能够同时执行多个查询/计数器。

任务由DataGridView中的单击事件开始:

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线程锁定,这不是一个理想的结果。

如有任何建议,不胜感激。

编辑:

我尝试使用文章中的示例代码(针对我的表单进行了一些调整):

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";
如果我在parent.Wait()中离开,UI线程就会锁定。如果我取出等待语句,"parent stopped"不会显示,但"child stopped"显示。

进一步阅读后,很多人建议使用"ContinueWith",但我需要两个任务同时运行,Continuation按顺序运行任务。

c# attachdchild任务永远不会执行

您的锁定可能是由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。运行而不是Task.Factory.StartNew…详见https://blogs.msdn.microsoft.com/pfxteam/2011/10/24/task-run-vs-task-factory-startnew/