2015-12-01 24 views
0
internal int SomeFunction() 
{ 
    Task<AddResult> task1 = new Task<AddResult>(() => AddFunction()); 
    task1.Start();    
    Task<FuncResult> task2 = task1.ContinueWith(task => func1(task1.Result), TaskContinuationOptions.OnlyOnRanToCompletion);  
    Task task3 = task2.ContinueWith(task => func2(task2.Result), TaskContinuationOptions.OnlyOnRanToCompletion); 
    Task task4 = task3.ContinueWith(task => func3(task2.Result), TaskContinuationOptions.OnlyOnRanToCompletion); 
    return 200; 
} 

無效回調(字節響應) {如何保證父任務的回調已經在孩子的任務已經完成

}

以上FUNC1和FUNC2功能

將一些數據發送到設備,響應將在回調函數中收到。 func3會將數據保存到數據庫中,但在此之前我需要確保所有的回調都已完成。我怎麼能做到這一點。

+2

谷歌「等待」關鍵詞。 –

+0

我不想阻止我的主線程。從回調 –

+0

呼叫persistedAddedNode,而不是從這個函數 – dariogriffo

回答

1

使用Task.WhenAll()並將您的各個任務存儲到集合中。

List<Task<t>> _tasks = new List<Task<t>>(); 

// Now add your tasks... 
_tasks.Add(Task<DeviceInfo>(() => AddNodeToNetwork((Modes)mode))); 
// Next task, etc. 

最後等待所有任務。這將在調用線程上運行awaiter。

await Task.WhenAll(_tasks); 

這將從線程池線程運行awaiter。

await Task.WhenAll(_tasks).ConfigureAwait(false); 
+0

我不認爲這會根據你 任務TASK3幫助 –

0

我想訣竅是在你的lambda表達式中引用名爲'task'的參數。這是你接下來的任務,所以如果你引用'task'而不是'task1','task2','task3'等,那麼通過詢問task.Result,你可以保證前面的任務已經被執行。

唯一的另一件事是,你將需要等待task4(最後一個)來完成,這你可以用電話做Task.WaitAll(new [] { task4 })

internal int SomeFunction() 
{ 
    Task<AddNodeResult> task1 = new Task<DeviceInfo>(() => AddNodeToNetwork()); 
    task1.Start();    
    Task<ZWNode> task2 = task1.ContinueWith(task => GetCommandClassesVersions(task.Result), TaskContinuationOptions.OnlyOnRanToCompletion);  
    Task task3 = task2.ContinueWith(task => GetManufacturerSpecific(task.Result), TaskContinuationOptions.OnlyOnRanToCompletion); 
    Task task4 = task3.ContinueWith(task => PersistAddedNode(task.Result), TaskContinuationOptions.OnlyOnRanToCompletion); 
    return 200; 
}  

道歉,如果這不能編譯 - 只需在這裏輸入文本編輯器!

+0

= task2.ContinueWith(任務=> GetManufacturerSpecific(task.Result),TaskContinuationOptions.OnlyOnRanToCompletion); 給出錯誤 –

相關問題