我正在开发一个ASP.NET MVC 4 Web应用程序。我使用的是.NET 4.5,并尝试利用新的异步API。我有一些情况需要在返回重要值的同时安排异步任务稍后运行。例如,这里有一个“登录”方法,我希望尽快返回一个新的SessionID,但是一旦我返回了SessionID,我想清除旧的过期SessionID。
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();
}
我尝试了很多不同的方法,包括 Task.Run() 和 Parallel.Invoke() 的组合,但 CleanSessions 从未被调用。我该如何实现后台任务调度?
SaveChangesAsync
完成时,应该启动CleanSessions
。它可能需要一个Task
和await
来捕获错误等 - 但从我所看到的来看,它应该可以按原样工作。 - Marc Gravellasync void
方法完成后再发送响应。但是,操作需要一种“fire-and-forget”的方式。 - Stephen Cleary