2017-03-12 2 views
0

私はすべての埋め込みリソースを1つのasyncにロードしようとしています。C#タスクWhenすべて、いくつかの変数でタスクを関連付ける

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を知る方法はありませんで、アレイ内のどの文字列に:

は、ここで私が持っているものです。

私は事前にリソース名「RES」

のおかげで、各タスクを関連付けるに行くかどう

+2

あなたのシナリオでは、asyncはあまり効果がないことに注意してください。 GetManifestResourceStreamは、メモリから直接読み取るため、同期操作のみをサポートするストリームを返します。 –

+0

良い点は、それはそれを解決する一つの方法です。 –

答えて

2

あなたはtodo収集のためDictionary<string, Task<string>>を使用することができますが(res変数がstringです)、あなたが追加することができますtodo.Add(res, reader.ReadToEndAsync());

この辞書にforeachするとき、あなたはres-taskのペアを取得します。

1

GetManifestResourceStreamはそれがメモリから直接

そうそう...

を読み取るためにのみ同期操作をサポートしているストリームを返す Michael Liu'sコメント

あたりとしてだから、僕は、この同期をロールアップ終了

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; 
    } 
関連する問題