2015-12-08 68 views
-3

我是新來的多任務,但我試圖瞭解它是如何工作的。我有下面的代碼,我認爲它會創建一個任務並運行performInitialLoad方法,並在完成時觸發initializeDataHarvester方法。 performInitialLoad工作正常,並且它到達方法的底部,因爲我可以在控制檯中看到「初始標記數據加載完成」文本。但它似乎從未觸發initializeDataHarvester方法。有任何想法嗎?立即C#Task.WhenAll不觸發下一個任務

private void mainTaskLoader() { 
    Task initialLoad = new Task(performInitialTagLoad); 
    initialLoad.Start(); 
    Task dataHarvester = new Task(() => { 
      Task.WhenAll(initialLoad); 
    }).ContinueWith(t => initializeDataHarvester());   
} 

private void performInitialTagLoad() { 
    allTags = globals.getTags(); 
    foreach (KeyValuePair<String, String> tag in allTags) { 
     try { 
      globals.insertUpdateHarvesterData(tag.Key.ToString(), commObject.Read(tag.Value.ToString())); 
     } catch (Exception e) { 
      Console.WriteLine("Error on initial load: " + e.Message, true);      
     } 
    } 
    Console.WriteLine("Initial tag data load complete");   
} 

private void initializeDataHarvester() { 
     Console.WriteLine("Got here!");    
} 
+0

當你的dataHarvester任務正在啓動? – skalinkin

+2

這就是爲什麼你從不使用任務構造函數;使用Task.Run創建一個代表線程池線程中委託運行的任務。 – Servy

+0

@skalinkin,我不打電話給它,因爲我認爲這就是ContinueWith方法的用處,一旦initialLoad任務完成,它將啓動dataHarvester任務?那不正確? – Phil

回答

4

Task.WhenAll回報 - 但它返回一個任務當任務都已完成,這將完成。您目前忽略了該返回值。你也沒有開始調用WhenAll的任務,這就是爲什麼這個任務從未完成。

你可以只使用:

Task.WhenAll(initialLoad).ContinueWith(...); 

...但更重要的是,你可以只,避免使用WhenAll都因爲你只得到了一個任務呢。

您還應該:

  • 瞭解異步/ AWAIT,這讓很多的東西容易
  • 開始下面的.NET命名約定

隨着異步/ AWAIT,此代碼將類似於:

private async Task MainTaskLoader() 
{ 
    await Task.Run(PerformInitialTagLoad); 
    InitializeDataHarvester(); 
} 

如果你真的有許多東西運行,你可以使用:

private async Task MainTaskLoader() 
{ 
    var task1 = Task.Run(PerformInitialTagLoad); 
    var task2 = Task.Run(SomethingElse); 
    // Imagine we have many of these... 
    await Task.WhenAll(task1, task2); 
    InitializeDataHarvester(); 
} 

理想情況下,你會做PerformInitialTagLoad異步方法以及,你要知道 - 這需要使插入異步過。

+0

我該如何去執行performInitialTagLoad方法異步?我嘗試將其更改爲私人異步任務performInitialTagLoad(),但引發了一個警告,我不使用等待... – Phil

+1

@Phil:大概可能'insertUpdateHarvesterData'是慢部分 - 所以* *將需要異步,你可以等待每個插入(或可能並行)。但我會把它全部工作在第一:) –

相關問題