c# - 在异步任务完成之前返回

标签 c# asp.net-mvc-4 .net-4.5 async-await

我正在开发 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 从未被调用过。如何实现后台任务调度?

最佳答案

不建议在没有请求的情况下在 ASP.NET 中运行任务。 It's dangerous.

也就是说,将 CleanSessions 更改为返回 Task,您可以这样做:

Task.Run(() => CleanSessions());

对于您的情况,我认为没问题,因为如果 CleanSessions 不执行或在执行过程中终止(这可能发生在 ASP.NET 中),则不会出现长期问题由于回收)。如果你想通知 ASP.NET 你有一些与请求无关的正在进行的工作,你可以使用 BackgroundTaskManager from my blog像这样:

BackgroundTaskManager.Run(() => CleanSessions());

关于c# - 在异步任务完成之前返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15124615/

相关文章:

c# - 使用 Phone Accent Brush 时按 Windows Phone 按钮不按任何按钮

c# - 避免按 。 (句点)键移动到日期时间选择器控件中的下一个字段

javascript - Web 表单错误 : Maximum Request Length Exceeded

asp.net-mvc-4 - 安装 VS 2013 + .Net 4.5.1 后,MVC View 中显示垃圾标签

c# - 使用 json 文件的 Asp.net Core 本地化

c# - 不同的模型从同一数据库的不同表中获取数据 ASP.NET MVC 4

c# - 具有状态/错误代码结果的事件目录身份验证

c# - 如何在 C# 中调试 "Unable to create a constant value of type ' System.Object'"?

.net - 从 .Net 4.0 到 4.5 的重定向解决方案 - 如何重定向 NuGet 包?

c# - 创建委托(delegate) token - 无法创建 SecurityTokenService