2017-03-12 4 views
0

Ich versuche, alle meine eingebetteten Ressourcen in einem Schritt async zu laden.C# Task WhenAll, Zuweisen von Aufgaben durch eine Variable

Hier ist, was ich habe:

private static async Task<String[]> GetResourcesAsync() 
    { 
     var asm = System.Reflection.Assembly.GetEntryAssembly(); 

     var todo = new List<Task<string>>(); 

     foreach (var res in asm.GetManifestResourceNames()) 
     { 
      using (Stream stream = asm.GetManifestResourceStream(res)) 
      using (StreamReader reader = new StreamReader(stream)) 
      { 
       todo.Add(reader.ReadToEndAsync()); 
      } 
     } 

     return await Task.WhenAll(todo); 
    } 

Aber das Problem mit diesem Ansatz ist, ich habe keine Möglichkeit zu wissen, welche Ressource corrosponds an der Zeichenfolge im Array.

Wie würde ich mich über jede Aufgabe einen Ressourcennamen ‚res‘ assoziieren

Vielen Dank im Voraus

+2

Beachten Sie, dass Async in Ihrem Szenario nicht viel erreicht. GetManifestResourceStream gibt einen Stream zurück, der nur synchrone Operationen unterstützt, da er direkt aus dem Speicher gelesen wird. –

+0

Guter Punkt, gut, das ist eine Möglichkeit, es zu lösen. –

Antwort

2

Sie können Dictionary<string, Task<string>> für die todo Sammlung verwenden (die res Variable ist ein string) und man kann hinzufügen zu dem Wörterbuch wie folgt: todo.Add(res, reader.ReadToEndAsync());

Danach erhalten Sie die Res-Task-Paare, wenn Sie auf dieses Wörterbuch foreach.

1

So landete ich Aufrollen gerade diese Synchronisierung per Michael Liu's Kommentar

GetManifestResourceStream einen Stream zurückgibt, die nur synchrone Operationen unterstützt, da sie direkt aus dem Speicher liest

So yeah ...

private Dictionary<string, IView> GetViewsFromAssembly() 
    { 
     var asm = System.Reflection.Assembly.GetEntryAssembly(); 

     var views = new Dictionary<string, IView>(); 

     foreach (var res in asm.GetManifestResourceNames()) 
     { 
      using (Stream stream = asm.GetManifestResourceStream(res)) 
      using (StreamReader reader = new StreamReader(stream)) 
      { 
       views.Add(res, new View(reader.ReadToEnd())); 
      } 
     } 

     return views; 
    } 
Verwandte Themen