我有兩個任務需要同時執行,並且頂級任務在其子節點結束時結束。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線程不會被鎖定,但子任務不會執行,就像以前一樣 難道是從事件處理程序引發這些問題開始這些任務嗎? –