2017-03-12 58 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; 
    }