2016-11-11 54 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線程不會被鎖定,但子任務不會執行,就像以前一樣 難道是從事件處理程序引發這些問題開始這些任務嗎? –