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

C# Asynchroniczność oczekiwanie na zakończenie asynchronicznej metody
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
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.

Kopiuj
CheckDirectory();
MessageBox.Show("Test");
Kopiuj
     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;
            }

        }
UR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 360
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.

M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
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”.

UR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 360
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.

Aventus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UK
  • Postów: 2235
0

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

Kopiuj
var task = DoSomethingAsync();
// Wykonaj inne operacje
await task;
kzkzg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 939
2

Zmień Void na Task i awaituj wyżej

Kopiuj
await CheckDirectory();
MessageBox.Show("Test");
M1
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 29
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”.

kzkzg
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 939
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.

UR
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 360
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.

FI
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: UK
  • Postów: 17
0

Możesz tez:

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

MyTask.Wait();

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.