【问题标题】:How to make a List of Async Tasks add elements to an Observable Collection?如何使异步任务列表将元素添加到可观察集合?
【发布时间】:2021-06-30 10:04:31
【问题描述】:

我正在尝试将以下方法转换为并行运行:

List<(DateTime start, DateTime end)> dates = CreateDateListTuple();

foreach ((DateTime start, DateTime end) date in dates)
        {
            dBInfos.Add(await GetDBInfo(date.start, date.end));
        }

我试图尝试的是首先创建一个任务列表:

List<Task<DBInfo>> parallelTasks = new List<Task<>>;

foreach((DateTime start,DateTime end) date in dates)
        {
            parallelTasks.Add(GetDBInfo(date.start, date.end));
        }

然后并行运行这些任务:

var continuation = await Task.WhenAll(parallelTasks.ToArray());
continuation.Wait();

然后将结果添加到集合中:

foreach (var result in continuation.Result)
        {
            dBInfos.Add(result);
        }

会发生什么,是程序冻结在

continuation.Wait();

命令,不抛出任何异常。实施可能有什么问题?

【问题讨论】:

  • Task.WhenAll 能够在调用Task.WhenAll&lt;Result&gt;(...) Task.WhenAll() 时返回Task&lt;TResult[]&gt; (dotnet 5)
  • 我已根据此信息更新问题,谢谢!
  • continuation 变量的类型是什么?为什么.Wait()?为什么.Result? Don't block on async code.

标签: c# asynchronous async-await observablecollection


【解决方案1】:

通过将代码末尾重写为:

        DBInfo[] continuation = await Task.WhenAll(parallelTasks.ToArray());

        foreach (DBInfo result in continuation)
        {
            dBInfos.Add(result);
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2018-01-20
    • 2011-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-18
    相关资源
    最近更新 更多