c# - 调用异步方法而不等待应答

标签 c# .net asp.net-mvc asynchronous async-await

我有 MVC 应用程序,我想保留有关我站点中事件的事件日志,例如, 如果用户登录成功,则向我的数据库插入一行描述此事件(名称为 X 的用户登录时间为 Y,IP 为 Z。

问题是我需要等待结果,我不关心结果,我不想让结果拖我后腿,我想把它发送给函数(更新Activity表中的DB 函数)并继续。

我将从下往上开始:

这是我的数据查询函数:

public static void InsertLogRecord(LogRecord lg)
{
    try
    {
         string query = "INSERT INTO ActivityLog VALUES('" + lg.Id + "','" + lg.Time + "','" + lg.Executor + "','" + lg.ExecutedOn + "','" + lg.Action + "','" + lg.StartState + "','" + lg.EndState + "','" + lg.IP + "')";

         AdoHelper.ExecuteNonQuery(query);
    }

    catch(Exception ex)
    {
         throw ex;
    }

}

这是我的 Controller 函数(调用了之前的“InsertLogRecord”函数)

public void UpdateLog(string exeOn, string action, string sState, string eState)
{
     LogRecord lg = new LogRecord(Guid.NewGuid().ToString(), DateTime.Now, User.Identity.Name, exeOn, action, sState, eState, Request.ServerVariables["REMOTE_ADDR"]);

     DataQueries.InsertLogRecord(lg);
}

使用示例:(在日志中存储一条操作记录,“用户登录”)

public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
{
    if (!ModelState.IsValid)
    {
        return View(model);
    }

    var result = await SignInManager.PasswordSignInAsync(model.UserName, model.Password, model.RememberMe, shouldLockout: false);

    switch (result)
    {
        case SignInStatus.Success:

              // Just before redirecting the user to the site I want to store the info' on my DB

             UpdateLog("", "Log in", "", "");

            return RedirectToLocal(returnUrl);


        case SignInStatus.LockedOut:
            return View("Lockout");
    }
}

我怎样才能正确地做到这一点?

最佳答案

您需要一种可靠的方式,以“即发即弃”的方式对项目进行排队。你可以做的是使用 HostingEnvironment.QueueBackgroundWorkItem 在 .NET 4.5.2 中引入,队列工作并通知 ASP.NET 环境,这样当它尝试回收您的应用程序时,它会知道挂起的工作仍在进行中。

如果您使用的是以前版本的 .NET 框架,您可以使用 Stephan Clearys BackgroundTaskManager .

我还推荐阅读 stephans 在 Fire and Forget in ASP.NET 上的帖子

编辑:

为了使用 HostingEnvironment 排队工作,只需将其传递给委托(delegate)即可。它可以是 Action<CancellationToken>Func<CancellationToken, Task> .

这是一个使用 Lambda 表达式的示例:

HostingEnvironment.QueueBackgroundWorkItem(cancellationToken =>
{
   // Put code here.
});

关于c# - 调用异步方法而不等待应答,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27638194/

相关文章:

c# - 窗体窗口关闭时执行一些清理操作

asp.net-mvc - 从 Controller 中的强类型 View 获取数据

c# - 打开表单时出现 ShowDialog 问题

c# - 处理排队的命令处理程序响应。 CQRS

c# - 带动画的多重触发

c# - ASP.Net Web 应用程序的插件

asp.net - 从ASP.Net MVC View 访问应用程序设置

c# - 如何在 C# 中反转逻辑交错数组的值?

c# - 为什么不能将 List<Derived> 分配给 List<Base>?

c# - 如何 "dock"/附加winforms表单