如何使Parallel等待所有异步任务完成?

P.ful

我正在制作资源加载代码。但有个问题。

var toDoList = new List<Action>();

toDoList.Add(async () =>
{
  await CanvasBitmap.LoadAsync(PATH1);
  Console.WriteLine("Load image");
});
toDoList.Add(async () =>
{
  await CanvasBitmap.LoadAsync(PATH2);
  Console.WriteLine("Load image");
});

// ...

toDoList.Add(async () =>
{
  await CanvasBitmap.LoadAsync(PATH100);
  Console.WriteLine("Load image");
});

toDoList.Add(() =>
{
  AudioSystem.Instance.Load(AUDIO_PATH1);
  Console.WriteLine("Load audio");
});

toDoList.Add(() =>
{
  AudioSystem.Instance.Load(AUDIO_PATH2);
  Console.WriteLine("Load audio");
});

// ...

toDoList.Add(() =>
{
  AudioSystem.Instance.Load(AUDIO_PATH100);
  Console.WriteLine("Load audio");
});

Console.WriteLine("Parallel Load Start");
Parallel.ForEach(toDoList, toDo => {
  toDo();
});
Console.WriteLine("Parallel Load End");

我想让Parallel等待所有LoadAsync函数完成。但是,由于异步Action委托,我没有等待。它表明

并行加载开始
加载音频
加载音频
加载图像
加载音频
加载图像
...
加载音频
并行加载结束
加载图像
加载图像
加载图像
...

由于它是Win2D的一部分,因此无法同步加载图像。(= WinRT API)
我理解为什么所有磁盘I / O任务都必须是异步方法。
但是,以上代码不是在UI线程上运行,而是在自定义线程上运行。因此,它不需要运行异步。
您可以认为,由于异步方法,并行是无用的。但是,如您所见,toDoValues同时具有异步(Win2D)和同步(音频)。需要并行以有效加载音频文件。

如何让Parallel等待所有资源加载完毕?

斯蒂芬·克莱里

需要并行以有效加载音频文件。

好吧,这Parallel是进行并行操作的一种方法。但是您的代码当前正在混合CPU绑定的操作和异步操作,并尝试使用进行合并Parallel,这适用于CPU绑定的操作。这就是为什么效果不佳的原因。

更好的方法是使用Task.Run而不是将CPU绑定的操作推送到线程池上Parallel然后,您可以它们视为异步的(从UI线程的角度来看),然后使用将它们与自然异步的I / O操作结合起来Task.WhenAll

使用示例代码,它看起来像这样:

var toDoList = new List<Func<Task>>();
toDoList.Add(async () =>
{
  await CanvasBitmap.LoadAsync(PATH1);
  Console.WriteLine("Load image");
});
toDoList.Add(async () =>
{
  await CanvasBitmap.LoadAsync(PATH2);
  Console.WriteLine("Load image");
});

// ...

toDoList.Add(async () =>
{
  await CanvasBitmap.LoadAsync(PATH100);
  Console.WriteLine("Load image");
});

toDoList.Add(() => Task.Run(() =>
{
  AudioSystem.Instance.Load(AUDIO_PATH1);
  Console.WriteLine("Load audio");
}));

toDoList.Add(() => Task.Run(() =>
{
  AudioSystem.Instance.Load(AUDIO_PATH2);
  Console.WriteLine("Load audio");
}));

// ...

toDoList.Add(() => Task.Run(() =>
{
  AudioSystem.Instance.Load(AUDIO_PATH100);
  Console.WriteLine("Load audio");
}));

Console.WriteLine("Concurrent Load Start");
var tasks = toDoList.Select(toDo => toDo()).ToList();
Console.WriteLine("Concurrent Load Started");
await Task.WhenAll(tasks);
Console.WriteLine("Concurrent Load End");

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类常见问题

如何等待所有异步调用完成

来自分类Dev

AngularJS等待foreach中的所有异步调用完成

来自分类Dev

等待异步任务完成

来自分类Dev

等待带有异常处理的所有任务的完成

来自分类Dev

我如何知道我的代码何时在Dart中完成区域中的所有异步工作?

来自分类Dev

如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

来自分类Dev

等待所有任务完成

来自分类Dev

等待异步任务完成

来自分类Dev

如何确定所有异步readFile()调用完成之后

来自分类Dev

取消所有异步任务

来自分类Dev

NodeJS等待所有异步命令完成

来自分类Dev

如何循环创建任务并等待所有任务完成

来自分类Dev

你如何等待所有异步调用在Java中完成?

来自分类Dev

如何等待所有异步完成?

来自分类Dev

使异步收集等待所有任务完成

来自分类Dev

具有异步lambda的Parallel.ForEach等待所有迭代完成

来自分类Dev

如何进行循环等待所有异步功能完成。异步函数里面有多个异步函数

来自分类Dev

如何等待所有异步调用完成

来自分类Dev

Dart-在for循环中等待所有异步任务

来自分类Dev

循环中的所有异步调用完成后,如何调用函数?

来自分类Dev

我如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

来自分类Dev

等待异步任务完成

来自分类Dev

在没有异步的情况下使用等待来完成任务

来自分类Dev

如何停止执行,直到所有异步任务在android中执行完毕?

来自分类Dev

如何获取异步代码以等待所有任务完成?

来自分类Dev

等待完成异步 lambda 表达式中的所有异步方法

来自分类Dev

如何强制 Paralled.Invoke 等待所有任务完成?

来自分类Dev

Tornado - 如何从 on_connection_close 停止所有异步“等待”

来自分类Dev

ngOnInit 中所有异步操作的角度等待栏

Related 相关文章

  1. 1

    如何等待所有异步调用完成

  2. 2

    AngularJS等待foreach中的所有异步调用完成

  3. 3

    等待异步任务完成

  4. 4

    等待带有异常处理的所有任务的完成

  5. 5

    我如何知道我的代码何时在Dart中完成区域中的所有异步工作?

  6. 6

    如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

  7. 7

    等待所有任务完成

  8. 8

    等待异步任务完成

  9. 9

    如何确定所有异步readFile()调用完成之后

  10. 10

    取消所有异步任务

  11. 11

    NodeJS等待所有异步命令完成

  12. 12

    如何循环创建任务并等待所有任务完成

  13. 13

    你如何等待所有异步调用在Java中完成?

  14. 14

    如何等待所有异步完成?

  15. 15

    使异步收集等待所有任务完成

  16. 16

    具有异步lambda的Parallel.ForEach等待所有迭代完成

  17. 17

    如何进行循环等待所有异步功能完成。异步函数里面有多个异步函数

  18. 18

    如何等待所有异步调用完成

  19. 19

    Dart-在for循环中等待所有异步任务

  20. 20

    循环中的所有异步调用完成后,如何调用函数?

  21. 21

    我如何知道页面上的所有异步调用何时完成(Parse Cloud函数)?

  22. 22

    等待异步任务完成

  23. 23

    在没有异步的情况下使用等待来完成任务

  24. 24

    如何停止执行,直到所有异步任务在android中执行完毕?

  25. 25

    如何获取异步代码以等待所有任务完成?

  26. 26

    等待完成异步 lambda 表达式中的所有异步方法

  27. 27

    如何强制 Paralled.Invoke 等待所有任务完成?

  28. 28

    Tornado - 如何从 on_connection_close 停止所有异步“等待”

  29. 29

    ngOnInit 中所有异步操作的角度等待栏

热门标签

归档