在不等待答案的情况下调用方法异步

Ron*_*Ron 2 .net c# asp.net-mvc asynchronous async-await

我有MVC应用程序,我想保留活动日志中有关我网站中的活动,例如,如果用户登录成功,则向我的数据库插入描述此活动的行(名称为X登录的用户)在时间Y与IP的Z.

问题是我需要等待结果,我不关心结果,我不希望结果阻止我,我想将它发送给函数(DB函数中的更新Activity表) )并继续.

我会自下而上开始:

这是我的数据查询功能:

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;
    }

}
Run Code Online (Sandbox Code Playgroud)

这是我的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);
}
Run Code Online (Sandbox Code Playgroud)

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

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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Yuv*_*kov 9

你需要的是一个可靠的方法来排列"Fire and Forget"中的物品.你可以做的是使用HostingEnvironment.QueueBackgroundWorkItem在.NET 4.5.2哪个队列工作,并通知ASP.NET环境,这样,当它试图回收您的应用程序,它会知道待审批工作仍然在起作用介绍.

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

我还建议在ASP.NET上阅读fire and Forget上的stephans帖子

编辑:

为了使用队列工作HostingEnvironment,只需传递一个委托.它可以是a Action<CancellationToken>或a Func<CancellationToken, Task>.

以下是使用Lambda Expression的示例:

HostingEnvironment.QueueBackgroundWorkItem(cancellationToken =>
{
   // Put code here.
});
Run Code Online (Sandbox Code Playgroud)