我正在开发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'来处理错误等 - 但是它应该按照我现在看到的那样“按现状”工作 – 2013-02-27 23:37:45
注意:你应该从未使用异步无效的方法,顶级事件处理程序除外。 – 2013-02-27 23:39:18
@MarcGravell:在发送响应之前,ASP.NET将等待所有'async void'方法的完成。操作者想要一个忘却火的人。 – 2013-02-27 23:40:36