C# Asynchroniczność oczekiwanie na zakończenie asynchronicznej metody

0

Witam, w kodzie wywołuję metodę która jest asynchroniczna, jednak w czasie gdy się ona wykonuje uruchamiane są dalsze polecenia które powinny wykonać się po tej asynchronicznej metodzie. Czy można ustawić tak by program czekał na zakończenie tej asynchronicznej metody i leciał potem dalej?

Test wyświetla się mimo że metoda wciąż się wykonywała.

CheckDirectory();
MessageBox.Show("Test");
     async void CheckDirectory()
        {
            if (!File.Exists(appPath))
            {
                MetroWindow metroWindow = (Application.Current.MainWindow as MetroWindow);
                if (await metroWindow.ShowMessageAsync("title", "message") == MessageDialogResult.Affirmative)
                {
                    CommonOpenFileDialog commonOpenFileDialog = new CommonOpenFileDialog();

                    commonOpenFileDialog.IsFolderPicker = true;
                    commonOpenFileDialog.ShowDialog();

                    pathToDirectory = commonOpenFileDialog.FileName;

                    while (!CheckCorrectPath(pathToDirectory, "app.exe"))
                    {
                        commonOpenFileDialog.ShowDialog();

                        pathToDirectory = commonOpenFileDialog.FileName;
                    }

                }
                else pathToDirectory = appPath;
            }

        }
0

Nie użyłeś awaita, więc nie dałeś znać kompilatorowi, że
MessageBox.Show("Test");
ma się wykonać po zakończeniu CheckGameDirectory.

Jak metoda
CheckDirectory
nie jest event handlerem, to robiąc metodę async void sam kopiesz sobie dołki.

0

No tylko że asynchroniczność wymusza na mnie if (await metroWindow.ShowMessageAsync("title", "message") == MessageDialogResult.Affirmative) ponieważ w przeciwnym razie kompilator wyrzuca mi taki błąd: Operatora „await” można używać tylko wewnątrz metody asynchronicznej. Rozważ możliwość oznaczenia tej metody za pomocą modyfikatora „async” i zmiany zwracanego przez nią typu na „Task”.

0

Bardziej chodziło o to, że async void to zło i używasz tylko jak musisz, bo konstrukcja api to wymusza.
Będziesz miał problemy z pochłoniętymi wyjątkami itd.

W każdym innym wypadku zwracasz Taska, a nie void.

0

Zwróć Task z metody asynchronicznej, przypisz go do zmiennej, wykonaj dalsze operacje a następnie zrób await tego taska.

var task = DoSomethingAsync();
// Wykonaj inne operacje
await task;
2

Zmień Void na Task i awaituj wyżej

await CheckDirectory();
MessageBox.Show("Test");
0

Zmieniłem void na Task async Task CheckDirectory() potem dałem await przed metodą await CheckDirectory(); ale nadal pojawia się błąd Operatora „await” można używać tylko wewnątrz metody asynchronicznej. Rozważ możliwość oznaczenia tej metody za pomocą modyfikatora „async” i zmiany zwracanego przez nią typu na „Task”.

1

Troche pomyslunku, kompilator ci podpowiada co masz zrobic. Dodaj ten async do sygnatury metody w ktorej wywolujesz te CheckDirectory(). A w ogole to jednak polecam troche poczytac o async/await.

0

No i dobrze, bo awaita można używać tylko w metodzie asynchronicznej.
Weź obejrzyj jakiś tutorial/przeczytaj dokumentację, bo tak to cały czas będziesz strzelał kulą w płot.

0

Możesz tez:

var myTask = Task.Run(() => DoSomethingAsync();

MyTask.Wait();

1 użytkowników online, w tym zalogowanych: 0, gości: 1