Problem z async i await

0

Cześć,
Chciałbym zrobic asynchroniczne zaciąganie modelu do widoku, niestety kod wykonuje się mi nadal synchronicznie, tzn. Dopiero po zaczytaniu modelu ładuje się widok, a chciałbym aby widok się wyświetlił już wczesniej użytkownikowi przykład :

public async Task<ActionResult> Index(){
return View("PokazCzlowieka",await getPersonAsync()); 
}

private async Task<Person> getPersonAsync(){
Person p = new Person(){Imie ="Jan"};
Thread.Sleep(10000); 
return p; 
}
1

:O
Ten asyn await działa po stronie serwera, to co Ty chcesz osiągnąć robi się w javascripcie.

0

dzięki za odpowiedź :)
W takim razie mam jeszcze jedno pytanko,

public ActionResult SaveCar(CarViewModel vm){
        services.SaveCar(vm); 
        var confirmation = services.CreateConfirmation(vm);

        services.AddNotification();
        return View(confirmation); 
}

Jak zrobić aby serwer zwrócił widok użytkownikowi a dopiero później wykonał metodę AddNotification ?
metoda Addnotification nie jest potrzebna do wyświetlenia uzytkownikowi potwierdzenia, i chciałbym by nie opóźniała czasu kiedy uzytkownik dostanie potweirdzenie

0

Jest na to kilka sposobów. Możesz użyć Task.Run, albo ThreadPool.QueueUserWorkItem

np

public ActionResult SaveCar(CarViewModel vm){
        services.SaveCar(vm); 
        var confirmation = services.CreateConfirmation(vm);

        Task.Run(() => services.AddNotification());
        return View(confirmation); 
}
0

Czy takie rozwiązanie niesie ze sobą jakieś zagrożenia bądź ma jakieś inne negatywne skutki ?
i czy można zamiast Task.Run zastosowac await ?

0

await powoduje czekanie po stronie serwera, jak nie chcesz czekać to musisz odpalić bez czekania Task.Run(). Odpalaniu tasków w taki sposób na serwerze jest zagrożone tym, że jeśli taki Task trwa długo, a aplikacja webowa zostanie zamknięta przez serwer, to task zostanie ubity, dlatego też w wersji asp .core wprowadzili BackgroundService, a w starszym asp od wersji 4.5.2 wprowadzili HostingEnvironment.QueueBackgroundWorkItem.

1

await powoduje "oczekiwanie" na zakończenie asynchronicznej operacji. Asynchronicznie nie oznacza współbieżnie.

0
ice25 napisał(a):
private async Task<Person> getPersonAsync(){
Person p = new Person(){Imie ="Jan"};
Thread.Sleep(10000); 
return p; 
}

W tej metodzie nie ma nic asynchronicznego. Z pewnością dostajesz warning że funkcja wykona się synchronicznie.

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