Kolejkowanie zadań przy użyciu await.

0

Dzień dobry,
jak zrobić aby dalsza cześć kodu została wykonana dopiero po wykonaniu tego kodu:

var _pobrany_id_kontrahenta = await baza.GetUserId(model_Kontrahent.Imie, model_Kontrahent.Nazwisko, model_Kontrahent.Telefon);

Niestety na chwilę obecną zdarza się ze czasem wykonywana jest dalsza część kodu bez wcześniejszego pobrania danych z _pobrany_id_kontrahenta.
Pozdrawiam,
Łukasz

0

Musisz wrzucić trochę więcej kodu, bo wrzucony przez Ciebie kawałek wygląda poprawnie. Pokaż metodę GetUserId i całą metodę w której jest to wykonywane.

Na jakiej podstawie wnioskujesz, że dalsza część kodu wykonuje się zanim zostaną zwrócone dane do _pobrany_id_kontrahenta?

0
froziu napisał(a):

Musisz wrzucić trochę więcej kodu, bo wrzucony przez Ciebie kawałek wygląda poprawnie. Pokaż metodę GetUserId i całą metodę w której jest to wykonywane.

Na jakiej podstawie wnioskujesz, że dalsza część kodu wykonuje się zanim zostaną zwrócone dane do _pobrany_id_kontrahenta?

 async Task SzybkieDodawaniaKontrahenta()
 {
     Kontrahent model_Kontrahent = new Kontrahent();
     GetUserId Id_Kontrahenta = new GetUserId();
     var parameters = new DialogParameters<ModulKontrahent_add>();
     parameters.Add(x => x.TrybSzybkieDodawanieKontrahent, true);
     var dialog = await DialogService.ShowAsync<ModulKontrahent_add>("SZYBKIE DODAWANIE KONTRAHENTA:", parameters);
     var wynik = await dialog.Result;
     if (!wynik.Canceled)
     {
         model_Kontrahent = await dialog.GetReturnValueAsync<Kontrahent>();

         var _pobrany_id_kontrahenta = await baza.GetUserId(model_Kontrahent.Imie, model_Kontrahent.Nazwisko, model_Kontrahent.Telefon);

         _pobrany_id_kontrahenta.ForEach(result =>

         model.Kontrahent_Id = result.Id);

         var _pelnaNazwauzytkownika = model_Kontrahent.Imie + " " + model_Kontrahent.Nazwisko + " - tel: " + model_Kontrahent.Telefon;
         
         

         //  Console.WriteLine(model_Kontrahent.Imie + " " + model_Kontrahent.Nazwisko + " - tel: " + model_Kontrahent.Telefon);

         _mudautocomplete.Text = _pelnaNazwauzytkownika;
         
         StateHasChanged();
     }

Co pewien czas w _mudautocomplete.Text wstawiana jest puste wartośc czyli zamiast np: Jan Kowalski - tel: 123-123-123 otrzymuje tylko -,, tel:".

0

Tylko że dane które twierdzisz, że przychodzą tu:

var _pelnaNazwauzytkownika = model_Kontrahent.Imie + " " + model_Kontrahent.Nazwisko + " - tel: " + model_Kontrahent.Telefon;

Pochodzą stąd:

model_Kontrahent = await dialog.GetReturnValueAsync<Kontrahent>();

a nie tak jak uznajesz, że stąd:

         var _pobrany_id_kontrahenta = await baza.GetUserId(model_Kontrahent.Imie, model_Kontrahent.Nazwisko, model_Kontrahent.Telefon);

Z kodu wynika że poczekanie lub nie na wykonanie tej linijki nie ma żadnego wpływu na Twój _mudautocomplete

Wynika więc z tego, że coś jest niehalo z tym:

model_Kontrahent = await dialog.GetReturnValueAsync<Kontrahent>();

Więc może ten dialog czasami nie jest poprawnie wypełniany? Ciężko powiedzieć, nie znam WinFormsów czy co tam jest pod spodem

0
froziu napisał(a):

Tylko że dane które twierdzisz, że przychodzą tu:

var _pelnaNazwauzytkownika = model_Kontrahent.Imie + " " + model_Kontrahent.Nazwisko + " - tel: " + model_Kontrahent.Telefon;

Pochodzą stąd:

model_Kontrahent = await dialog.GetReturnValueAsync<Kontrahent>();

a nie tak jak uznajesz, że stąd:

         var _pobrany_id_kontrahenta = await baza.GetUserId(model_Kontrahent.Imie, model_Kontrahent.Nazwisko, model_Kontrahent.Telefon);

Z kodu wynika że poczekanie lub nie na wykonanie tej linijki nie ma żadnego wpływu na Twój _mudautocomplete

Wynika więc z tego, że coś jest niehalo z tym:

model_Kontrahent = await dialog.GetReturnValueAsync<Kontrahent>();

Więc może ten dialog czasami nie jest poprawnie wypełniany? Ciężko powiedzieć, nie znam WinFormsów czy co tam jest pod spodem

Formularz zawsze jest wypełniony nawet testowalem go tymi samymi wartościami. Niestety robi sobie losowanie że raz pobierze a raz nie. Fronted jest w Blazorze.

0

pokaż kod tego DialogService

Co pewien czas

co to znaczy? Nie potrafisz tego odtworzyć? Może leci gdzieś wyjątek i result nie jest "Canceled"

0
obscurity napisał(a):

pokaż kod tego DialogService

Co pewien czas

co to znaczy? Nie potrafisz tego odtworzyć? Może leci gdzieś wyjątek i result nie jest "Canceled"

Zawartość komponentu ModulKontrahent_add, który obsługiwany jest za pomocą DialogService.

    public partial class ModulKontrahent_add
    {
        [CascadingParameter] MudDialogInstance MudDialog { get; set; }

        [Parameter] public bool TrybSzybkieDodawanieKontrahent { get; set; } = false;
        //public Kontrahent _dane { get; set; }
        void Zamknij() => MudDialog.Cancel();

        string[] errors = { };

        MudForm form;

        public bool Pokaz_duplikat = false;
        public bool Pokaz_Reset = false;
        public bool Pokaz_duplikat_numer_telefonu = false;

        void wyczysc_pola()
        {
            model.Imie = string.Empty;
            model.Nazwisko = string.Empty;
            model.Telefon = string.Empty;
        }

        void UkryjElementy()
        {
            Pokaz_duplikat = false;
            Pokaz_Reset = false;
            Pokaz_duplikat_numer_telefonu = false;
            StateHasChanged();
        }


        public PatternMask mask1onlyphoneformat = new PatternMask("###-###-###")
        {
            MaskChars = new[] { new MaskChar('#', @"[0-9]") }
        };
        public async Task Przycisk_Reset()
        {
            var parameters = new DialogParameters<OknoDialogowe_Wybor>();
            parameters.Add(x => x.ContentText, "Czy na pewno wyczyścić zawartość pól?");
            parameters.Add(x => x.ButtonText, "Tak");
            parameters.Add(x => x.Color, Color.Warning);
            parameters.Add(x => x.Wykonaj, ResetujZawartosc);
            parameters.Add(x => x.Ukryj, UkryjElementy);
            await DialogService.ShowAsync<OknoDialogowe_Wybor>("Confirm", parameters);

        }

        public async Task SzybkieDodawanieKontrahenta()
        {
           await Zapisz();
            MudDialog.Close<Kontrahent>(model);
        }
        
        public async Task Zapisz()
        {
          await form.Validate();

            if (form.IsValid)
            {
                var data = await baza.DuplicateOfCustomer(model.Imie, model.Nazwisko);
                var dataphonenumber = await baza.ControlOfPassword(model.Telefon);

                foreach (var DataResult in data)
                {
                    if (DataResult.kontrola != 0)
                    {

                        Snackbar.Configuration.PositionClass = Defaults.Classes.Position.BottomRight;
                        Snackbar.Add("Taki kontrahent już istnieje w bazie.", MudBlazor.Severity.Warning);
                        Pokaz_duplikat = true;
                        return;
                    }

                }

                foreach (var DataResult in dataphonenumber)
                {
                    if (DataResult.kontrola != 0)
                    {
                        Pokaz_duplikat_numer_telefonu = true;
                        Snackbar.Configuration.PositionClass = Defaults.Classes.Position.BottomRight;
                        Snackbar.Add("Ten numer telefonu istnieje już w bazie.", MudBlazor.Severity.Warning);
                        return;
                    }
                }

                ZapiszKontrehenta();

            }
            else
            {

                Snackbar.Configuration.PositionClass = Defaults.Classes.Position.BottomRight;
                Snackbar.Add("Nie można dodać kontrahenta.\nSprawdź wszystkie wymagane pola!", MudBlazor.Severity.Warning);

            }
        }

        UserValidatorModel UserValidator = new UserValidatorModel();
        Kontrahent model = new Kontrahent();

        public class UserValidatorModel : AbstractValidator<Kontrahent>
        {
            public UserValidatorModel()
            {
                RuleFor(x => x.Nazwisko).NotEmpty().WithMessage("Pole nazwisko nie może być puste.").Matches("^[A-ZŻŹĆĄŚĘŁÓŃ][a-zżźćńółęąś]*$").WithMessage("Wartośc musi zaczynać się z wielkiej litery,a reszta z małych. Nie używaj znaków specjalnych!").Matches("^[^0-9]*$").WithMessage("Nie można używać tutaj liczb.");
                RuleFor(x => x.Imie).NotEmpty().WithMessage("Pole imie nie może by puste.").Matches("^[A-ZŻŹĆĄŚĘŁÓŃ][a-zżźćńółęąś]*$").WithMessage("Wartość musi zaczynać się z wielkiej litery,a reszta z małych. Nie używaj znaków specjalnych.").Matches("^[^0-9]*$").WithMessage("Nie można używać tutaj liczb.");
                RuleFor(x => x.Telefon).NotNull().WithMessage("Pole numer telefonu nie może być puste.").NotEmpty().WithMessage("Numer telefonu nie może być pusty!").Matches(new Regex(@"^\d{3}-\d{3}-\d{3}$")).WithMessage("Numer telefonu jest nie prawidłowy.");

            }

            public Func<object, string, Task<IEnumerable<string>>> ValidateValue => async (model, propertyName) =>
            {
                var result = await ValidateAsync(ValidationContext<Kontrahent>.CreateWithOptions((Kontrahent)model, x => x.IncludeProperties(propertyName)));
                if (result.IsValid)
                    return Array.Empty<string>();
                return result.Errors.Select(e => e.ErrorMessage);
            };
        }

        public async void ResetujZawartosc()
        {
            wyczysc_pola();
            UkryjElementy();
        }

        public async void ZapiszKontrehenta()
        {

            if (await baza.CustomerAdd(model) == true)
            {
                Snackbar.Configuration.PositionClass = Defaults.Classes.Position.BottomRight;
                Snackbar.Add("Kontrahent został dodany!", MudBlazor.Severity.Success);
                wyczysc_pola();

            }
            else
            {
                Snackbar.Configuration.PositionClass = Defaults.Classes.Position.BottomRight;
                Snackbar.Add("Kontrahent nie został dodany!", MudBlazor.Severity.Error);
            }
            Pokaz_duplikat = false;
            Pokaz_duplikat_numer_telefonu = false;
            await InvokeAsync(StateHasChanged);
        }
    }
}


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