Закройте форму только после того, как задача была выполнена - PullRequest
0 голосов
/ 25 декабря 2018

У меня есть задача очистки, которая удаляет большой файл при выходе.

private async Task DoCleanup()
{
    await Task.Run(() =>
    {
        File.Delete(FilePath);
    });
}

Теперь я хочу дождаться этой задачи при выходе (событие FormClosing), но форма закрывается до полного удаления файла.

Я пытался отменить событие и выйтиприложение вручную, как это:

private async void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
   this.Hide();
   e.Cancel = true;
   await DoCleanup();
   Application.Exit();
}

Но задача вызывается снова и снова (как бесконечный цикл).Что мне делать?

1 Ответ

0 голосов
/ 25 декабря 2018

Вы можете создать событие, которое вызывает функцию, и связать событие с Application.Close() после завершения Task.

         public async static Task Main(string[] args)
            {

YourClassName classInstance = new YourClassName();

                // Bind the event to something
                classInstance .CompletedTaskEvent += (s, e) => Console.WriteLine("Completed work");

                // Start the work
                await classInstance.DoCleanup();

                Console.ReadLine();
            }


    public class YourClassName
    {
            // Some event
            public event EventHandler CompletedTaskEvent;


            public async Task DoCleanup()
            {
                await Task.Run(async () =>
                {
                    await Task.Delay(2500);

                    // When the task completes invoke the event
                    // And pass the current class instance to the sender
                    // And you can add any kind of event argument you want
                    // however I recommend you make the event generic and then pass the argument type
                    CompletedTaskEvent?.Invoke(this, eventArguments);
                });
            }
    }
...