2015-12-08 96 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'是慢部分 - 所以* *将需要异步,你可以等待每个插入(或可能并行)。但我会把它全部工作在第一:) –