У меня есть веб-приложение 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 и чтобы можно было обработать завершение задачи (выполнить определенный код после окончания кодирования).
Можете ли вы помочь мне с этим? Если вам нужна дополнительная информация, пожалуйста, кричите!
Task.ContinueWith
является отправной точкой. Вам придется где-то держать ссылку на задание, чтобы оно не было собрано (не знаю, это немного культивирование груза, но я бы поспорил, что это сработает). Вам нужно будет использовать что-то вроде Signalr или опрос из браузера, чтобы обновить пользователя, когда это будет сделано. - person   schedule 20.02.2018