簡體   English   中英

UWP - 如何啟動並行運行的多個任務?

[英]UWP - How to start multiple tasks running in parallel?

我有一個應用程序,其中我 select 多個(300-500)圖像然后創建一個視頻,其中每個圖像都是一個幀。 為了將這些圖像加載到合成中進行播放,我需要將它們轉換並保存到臨時 memory 才能加載它們。 這個轉換/保存過程需要一些時間,我正試圖找到加快任務的方法。

讓這個轉換任務的多個實例並行發生的好方法是什么? 目前,在進行轉換時,CPU 使用率很低 (4%-6%)。

這是我希望它的工作方式:

  1. 用戶選擇多個圖像文件

  2. 在臨時存儲中創建一個文件夾

  3. 創建多個圖像轉換/保存任務並並行運行。

  4. 轉換保存完成后,將臨時存儲文件夾中的所有轉換后的圖像都選中並加載到合成中進行播放。

這是我現在擁有的:

private async Task OpenImageSequence(IReadOnlyList<StorageFile> files)
{

    destFolder = await ApplicationData.Current.TemporaryFolder.CreateFolderAsync(NameNoExt, CreationCollisionOption.GenerateUniqueName);
    var composition = new MediaComposition();

    foreach (StorageFile file in files)
    {
        CreateImage(file);
    }

    IReadOnlyList<StorageFile> fileList = await destFolder.GetFilesAsync();

    foreach (StorageFile imgFile in fileList)
    {
        var clip = await MediaClip.CreateFromImageFileAsync(imgFile, TimeSpan.FromSeconds(frameIncrement));
        composition.Clips.Add(clip);
    }

    MediaStreamSource newImageSequence = composition.GenerateMediaStreamSource(defaultProfile);
    windowsSource = MediaSource.CreateFromMediaStreamSource(newImageSequence);

}

private async Task CreateImage(StorageFile file)
{
    var stream = await file.OpenStreamForReadAsync();
    
    //....Image Conversion Code....//

    var destFile = await destFolder.CreateFileAsync("exrConvert.png", Windows.Storage.CreationCollisionOption.GenerateUniqueName);

    await canvas.SaveAsync(destFile.Path.ToString(), CanvasBitmapFileFormat.Png);
}

基本上我希望有盡可能多的 CreateImage 任務實例並行運行。 關於我如何 go 這樣做的任何想法?

我嘗試了以下 10 張圖像的選擇,但圖像似乎沒有被並行處理:

    Task t1 = CreateImage(files.ElementAt(0));
    Task t2 = CreateImage(files.ElementAt(1));
    Task t3 = CreateImage(files.ElementAt(2));
    Task t4 = CreateImage(files.ElementAt(3));
    Task t5 = CreateImage(files.ElementAt(4));
    Task t6 = CreateImage(files.ElementAt(5));
    Task t7 = CreateImage(files.ElementAt(6));
    Task t8 = CreateImage(files.ElementAt(7));
    Task t9 = CreateImage(files.ElementAt(8));
    Task t10 = CreateImage(files.ElementAt(9));

    await Task.WhenAll(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10);

感謝您的任何幫助,您可以提供!

為了讓多個任務並行運行,每個任務都必須組合為后台任務。 所以你需要使用Task.Run()什么的。 具有任務返回類型的普通異步 function 不會產生后台任務。

//foreach (StorageFile file in files)
//{
//    await CreateImage(file);
//}
var tasks_in_background_thread = files.Select(file => Task.Run(async () =>
{
    await CreateImage(file);
}));
await Task.WhenAll(tasks_in_background_thread);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM