C#Task WhenAll,通过某个变量关联任务

时间:2017-03-12 14:45:57

标签: c# asynchronous task system.reflection

我尝试将所有嵌入资源一次性加载异步。

以下是我所拥有的:

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

但是这种方法的问题是我无法知道哪些资源与数组中的哪个字符串发生冲突。

我如何将每项任务与资源名称相关联&#39;

提前致谢

2 个答案:

答案 0 :(得分:2)

您可以Dictionary<string, Task<string>>用于todo集合(res变量是string),您可以像这样添加到词典中:todo.Add(res, reader.ReadToEndAsync());

之后,当您使用此词典时,您将获得res-task对。

答案 1 :(得分: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;
    }