C# — кодирование видео с помощью служб мультимедиа Azure асинхронно и выполнение задачи

У меня есть веб-приложение ASP.NET MVC, и я хочу закодировать видео с помощью служб мультимедиа Azure.

Поскольку этот процесс длится слишком долго, мне нужно запустить его асинхронно, чтобы не заставлять пользователя ждать обработки этого действия. Также мне нужно как-то обработать выполнение этой задачи, как только она завершится.

Документация по службам мультимедиа Azure содержит скелет кода для реализации этого:

static public IAsset EncodeToAdaptiveBitrateMP4Set(IAsset asset)
{
    // Declare a new job.
    IJob job = _context.Jobs.Create("Media Encoder Standard Job");
    // Get a media processor reference, and pass to it the name of the 
    // processor to use for the specific task.
    IMediaProcessor processor = GetLatestMediaProcessorByName("Media Encoder Standard");

    // Create a task with the encoding details, using a string preset.
    // In this case "Adaptive Streaming" preset is used.
    ITask task = job.Tasks.AddNew("My encoding task",
        processor,
        "Adaptive Streaming",
        TaskOptions.None);

    // Specify the input asset to be encoded.
    task.InputAssets.Add(asset);
    // Add an output asset to contain the results of the job. 
    // This output is specified as AssetCreationOptions.None, which 
    // means the output asset is not encrypted. 
    task.OutputAssets.AddNew("Output asset",
        AssetCreationOptions.None);

    job.StateChanged += new EventHandler<JobStateChangedEventArgs>(JobStateChanged);
    job.Submit();
    job.GetExecutionProgressTask(CancellationToken.None).Wait();

    return job.OutputMediaAssets[0];
}

private static void JobStateChanged(object sender, JobStateChangedEventArgs e)
{
    // do something when job state changes 
}

Этот код выполняет кодирование видео в службах мультимедиа Azure, но обработка выполняется синхронно, поэтому пользователь блокируется до завершения этого действия.

Вместо этой инструкции, которая заставляет программу ждать завершения задачи:

job.GetExecutionProgressTask(CancellationToken.None).Wait();

, мне нужно что-то, чтобы задание выполнялось асинхронно в службах мультимедиа Azure и чтобы можно было обработать завершение задачи (выполнить определенный код после окончания кодирования).

Можете ли вы помочь мне с этим? Если вам нужна дополнительная информация, пожалуйста, кричите!


person mihai94stk    schedule 20.02.2018    source источник
comment
Task.ContinueWith является отправной точкой. Вам придется где-то держать ссылку на задание, чтобы оно не было собрано (не знаю, это немного культивирование груза, но я бы поспорил, что это сработает). Вам нужно будет использовать что-то вроде Signalr или опрос из браузера, чтобы обновить пользователя, когда это будет сделано.   -  person    schedule 20.02.2018


Ответы (2)


Мы рекомендуем вам зарегистрироваться для получения уведомлений — см. это для получения дополнительной информации.

person Anil Murching    schedule 20.02.2018

А как же просто:

await job.GetExecutionProgressTask(CancellationToken.None);
person ttugates    schedule 14.03.2018