Pracuję nad aplikacją sieci web ASP.NET MVC 4. Korzystam z .NET 4.5 i próbuję skorzystać z nowych asynchronicznych interfejsów API.Powrót przed asynchroniczne Zadanie zakończone
Mam kilka sytuacji, w których chcę zaplanować zadanie asynchroniczne, aby uruchomić je później, a ja natychmiast zwrócę natychmiast ważną wartość. Na przykład, tutaj jest „Logowanie” metoda, która chcę wrócić nowy SessionID tak szybko, jak to możliwe, ale po Wróciłem sessionid Chcę oczyścić stary wygasł SessionID użytkownika:
public async Task<Guid> LogIn(string UserName, string Password)
{
//Asynchronously get ClientID from DB using UserName and Password
Session NewSession = new Session()
{
ClientID = ClientID,
TimeStamp = DateTime.Now
};
DB.Sessions.Add(NewSession);
await DB.SaveChangesAsync(); //NewSession.ID is autopopulated by DB
CleanSessions(ClientID); //Async method which I want to execute later
return NewSession.ID;
}
private async void CleanSessions(int ClientID)
{
//Asynchronously get expired sessions from DB based on ClientID and mark them for removal
await DB.SaveChangesAsync();
}
ja już próbowałem wielu różnych rzeczy, w tym kombinacji Task.Run() i Parallel.Invoke(), ale CleanSessions nigdy nie zostanie wywołany. Jak mogę zaplanować zadania w tle?
Na tej podstawie 'CleanSessions' powinien otrzymać * uruchomiony * po zakończeniu operacji" SaveChangesAsync ". Być może może to być spowodowane zadaniem 'Task' i' await' aby złapać błędy itp. - ale powinno działać "tak, jak jest" z tego, co widzę tam –
Uwaga: Powinieneś * nigdy * używać 'async void' dla swoich metod, z wyjątkiem programów obsługi zdarzeń na najwyższym poziomie. –
@MarcGravell: ASP.NET będzie czekał na zakończenie wszystkich metod 'async void' przed wysłaniem odpowiedzi. Op chce mieć ogień i zapomnieć. –