Skip to content

Async Await – flaga isBusy

Załóżmy, że nasze asynchroniczne zadanie odpalane jest na jakiś event, np. kliknięcie przycisku.

Co jeśli zadanie jest dość wyczerpujące, a na dodatek nie powinno być wywoływane więcej niż raz w krótkim czasie? (przez zniecierpliwionego użytkownika, który klika po kilka razy w ten sam przycisk bo myśli, że to pomoże).

W takim przypadku powinniśmy przede wszystkim, poinformować użytkownika, że trwają obliczenia (jakaś grafika – busy indicator) oraz zablokować przycisk, tak aby nie można było już w niego kliknąć.

Super. Pewnie to wystarczy. A co jeśli zdarzeniem nie jest kliknięcie przycisku tylko cokolwiek innego, być może nie związanego z interfejsem użytkownika.
Generalnie, przyda się flaga, która będzie stawiana gdy obliczenia się wykonują – odpowiednik IsBusy w klasie BackgroundWorker.

Rozwiązanie jest banalne.

        private bool isBusy = false;
        private async void sthAsync(object sender, EventArgs e)
        {
            if (!isBusy)
            {
                isBusy = true;
                await someTaskAsync();
                isBusy = false;
            }
        }

        private Task someTaskAsync()
        {
            return Task.Run(() =>
            {
                Thread.Sleep(2 * 1000);// 1000ms = 1s
            });
        }

To czy metoda asynchroniczna będzie wywołana uzależniamy od wartości flagi isBusy.
Przed i po wywołaniu metody asynchronicznej ze słówkiem await, zmieniamy wartość flagi isBusy.

To tyle. Tym razem kodu nie umieszczam na GITHUB, ponieważ cały potrzebny kod jest w tym wpisie 😉

Published inProgramowanie

Be First to Comment

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *