c # асинхронная ожидающая задача: не удается дождаться ‘void’

#c# #async-await

#c# #async-ожидание

Вопрос:

Я использовал Xabe.FFmpeg для проекта. Задачи, асинхронность и ожидание для меня новы, но я учился. Я пытаюсь выполнить базовое преобразование с помощью Xabe.FFmpeg. Я получаю сообщение об ошибке «не удается дождаться ‘void'».

 public partial class FormMain : Form
{
    public FormMain()
    {
        InitializeComponent();
    }

    private void FormMain_Load(object sender, EventArgs e)
    {
        Run().GetAwaiter().GetResult();
    }

    private static async Task Run()
    {
        string inputFileName = @"C:UsersnpsieVideosSample.mkv";
        string outputFileName = Path.ChangeExtension(inputFileName, ".mp4");
        await FFmpeg.FFmpeg.Conversions.FromSnippet.ToMp4(inputFileName, outputFileName).Start();
    }
}
  

Комментарии:

1. FormMain_Load вероятно, должно быть async void , и тогда вы должны ждать Run вместо использования GetAwaiter().GetResult()

Ответ №1:

Вы пытаетесь await выполнить вызов .Start() на Task возвращаемый ToMp4() . Удалите этот вызов Start() и дождитесь самого возвращаемого Task :

 await FFmpeg.FFmpeg.Conversions.FromSnippet.ToMp4(inputFileName, outputFileName);
  

Комментарии:

1. Это тоже была моя первая мысль, но, глядя на документы , Start() можно ожидать.

2. @GazTheDestroyer: Эти документы кажутся немного легкими в деталях. Где документация для .ToMp4() ? Если она возвращает a, Task то .Start() она не подлежит ожиданию . Также возможно, и не беспрецедентно, что в документации библиотеки могут быть ошибки.

3. @user3646458 возможно, у вас будет некоторый успех при вызове ее внутри Task.Run() . Возможно, библиотека пропустила ConfigureAwait(false)