Пример:
private async void Button7_Click(object sender, EventArgs e)
{
await Task.Run(() =>
{
//code here that takes a long time. NB nothing that must be run on the main thread
var ffmpeg = new NReco.VideoConverter.FFMpegConverter();
ffmpeg.Stop();
});
//when the above task completes this will then be called on the original thread context (i.e. the main ui thread)
MessageBox.Show("convert is stopped");
}
Обратите внимание, что MessageBox.Show будет вызываться после завершения задачи, но элемент управления вернется в основной поток при вызове await. Это то, что сбивает с толку людей, плохо знакомых с асинхронностью.
Также обратите внимание, что обычно асинхронная функция будет иметь тип возврата Task
или Task<T>
, но, поскольку это обработчик событий, она имеет тип возврата void. Это один из немногих случаев, когда возвращаемый тип void верен для асинхронной функции.