我正在编写一个资源加载代码,但是遇到了问题。
我希望能让Parallel等待所有LoadAsync函数完成后再执行。但是,由于异步Action委托,我没有等待。结果显示为:
Parallel Load Start 加载音频 加载音频 加载图像 加载音频 加载图像 ... 加载音频 Parallel Load End 加载图像 加载图像 加载图像 ...
由于它是Win2D的一部分(= WinRT API),所以没有同步加载图像的方法。 我理解为什么所有磁盘I/O任务必须是异步方法。 但是,上面的代码运行在非UI线程而是自定义线程上。因此,它不需要异步运行。 你可能认为Parallel由于异步方法是无用的。但是,正如您所看到的,toDoValues既具有异步方式(Win2D)又具有同步方式(Audio)。并且对于有效地加载音频文件,需要使用Parallel。
如何使Parallel等待所有资源加载完成?
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委托,我没有等待。结果显示为:
Parallel Load Start 加载音频 加载音频 加载图像 加载音频 加载图像 ... 加载音频 Parallel Load End 加载图像 加载图像 加载图像 ...
由于它是Win2D的一部分(= WinRT API),所以没有同步加载图像的方法。 我理解为什么所有磁盘I/O任务必须是异步方法。 但是,上面的代码运行在非UI线程而是自定义线程上。因此,它不需要异步运行。 你可能认为Parallel由于异步方法是无用的。但是,正如您所看到的,toDoValues既具有异步方式(Win2D)又具有同步方式(Audio)。并且对于有效地加载音频文件,需要使用Parallel。
如何使Parallel等待所有资源加载完成?
WhenAll
或WaitAll
等待它们全部完成。 - TheGeneralFunc<..., Task<T>>
,要么全部使用同步操作。 - Richard