2013-02-06 10 views
-1

Je dois charger deux gros fichiers parallèles jusqu'à présent, j'ai ce codecomment exécuter de manière asynchrone

Le code ci-dessous est la méthode de bouton de clic

private async void MILoadLogFile_Click(object sender, RoutedEventArgs e) 
{  
    ... 
    if (oFD.ShowDialog() == true) 
    { 
     await myLogSession.LoadCompassLogAsync(oFD.FileName); 
     await myLogSession.LoadCoreServiceLogAsync(oFD.FileName); 
    } 
} 

méthode de chargement:

public async Task LoadCompassLogAsync(String fileName) 
{ 
    StreamReader streamReader = new StreamReader(fileName); 
    if (fileName.Contains("Compass")) 
    { 
     ... 
     try 
     { 
      using (streamReader) 
      { 
       //Console.Out.WriteLine("lineCount: " + lineCount); 
       while (((line = await streamReader.ReadLineAsync()) != null) 
         && !CompassLogLoadCompleted) 
       { 
        ... 
        loggingLvl = new LoggingLvl(eLoggingLvl); 
        CompassLogData cLD = new CompassLogData(id, dateTime, loggingLvl, threadId, loggingMessage); 

        await addRoCompassLogCollectionAsync(cLD); 
       } 
      } 
     } 
     catch (Exception e) 
     { 
      Console.WriteLine("The file could not be read:"); 
      Console.WriteLine(e.Message); 
     } 
    } 
} 

le LoadCoreServiceLogAsync est presque identique à LoadCompassLogAsync.

Les deux méthodes de chargement s'exécutent séquentiellement. Je veux qu'ils courent en parallèle.

+1

Y at-il une question ici? – CodingGorilla

Répondre

1

Votre code exécutera une tâche après l'autre. Pour exécuter les deux tâches en parallèle, vous pouvez utiliser la méthode Task.WaitAll:

var loadCompassLogTask = myLogSession.LoadCompassLogAsync(oFD.FileName); 
var loadCoreServiceLogTask = myLogSession.LoadCoreServiceLogAsync(oFD.FileName); 
Task.WaitAll(loadCompassLogTask, loadCoreServiceLogTask); 

Ou si vous voulez utiliser await vous pouvez utiliser Task.WhenAll:

var loadCompassLogTask = myLogSession.LoadCompassLogAsync(oFD.FileName); 
var loadCoreServiceLogTask = myLogSession.LoadCoreServiceLogAsync(oFD.FileName); 
await Task.WhenAll(loadCompassLogTask, loadCoreServiceLogTask); 
+2

+1 pour la deuxième option qui serait préférable étant donné que cela semble être appelé depuis le thread UI. –

+0

@Daniel Kelley, est-il possible d'utiliser la deuxième option sans utiliser UI Thread? – persianLife

+1

@pars Ce que je voulais dire, c'est que vous appelez les deux méthodes à partir du thread UI (vous répondez à un événement click). Cependant, en utilisant 'wait Task.WhenAll', vous ne pouvez pas bloquer le thread d'interface utilisateur. Je crois que la première option entraînerait le blocage du thread d'interface utilisateur. –

Questions connexes