2017-03-12 99 views
0

我試圖一次性加載所有嵌入式資源異步。C#任務WhenAll,通過某個變量關聯任務

這是我有:

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); 
    } 

但是這種方法的問題是我不知道什麼資源corrosponds的方式,這串在數組中。

我怎麼會去提前每個任務的資源名稱「水庫」

由於關聯

+2

請注意,異步在您的方案中沒有多大成就。 GetManifestResourceStream返回一個只支持同步操作的流,因爲它直接從內存中讀取。 –

+0

好點,這是解決它的一種方法。 –

回答

2

可以使用Dictionary<string, Task<string>>todo集合(該res變量是一個string),你可以添加到這樣的字典:todo.Add(res, reader.ReadToEndAsync());

之後,當你在這本詞典foreach時,你會得到res-task對。

1

所以我最終只是滾動此同步按Michael Liu's評論

GetManifestResourceStream,因爲它直接從內存

所以是讀取返回只支持同步操作流...

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; 
    }