Use Task.Run instead of Delegate.BeginInvoke

后端 未结 3 432
被撕碎了的回忆
被撕碎了的回忆 2021-02-06 08:11

I have recently upgraded my projects to ASP.NET 4.5 and I have been waiting a long time to use 4.5\'s asynchronous capabilities. After reading the documentation I\'m not sure wh

3条回答
  •  闹比i
    闹比i (楼主)
    2021-02-06 08:17

    Here's one of the filters in my project with creates an audit in our database every time a user accesses a resource that must be audited

    Auditing is certainly not something I would call "fire and forget". Remember, on ASP.NET, "fire and forget" means "I don't care whether this code actually executes or not". So, if your desired semantics are that audits may occasionally be missing, then (and only then) you can use fire and forget for your audits.

    If you want to ensure your audits are all correct, then either wait for the audit save to complete before sending the response, or queue the audit information to reliable storage (e.g., Azure queue or MSMQ) and have an independent backend (e.g., Azure worker role or Win32 service) process the audits in that queue.

    But if you want to live dangerously (accepting that occasionally audits may be missing), you can mitigate the problems by registering the work with the ASP.NET runtime. Using the BackgroundTaskManager from my blog:

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
      var request = filterContext.HttpContext.Request;
      var id = WebSecurity.CurrentUserId;
    
      BackgroundTaskManager.Run(() =>
      {
        try
        {
          var audit = new Audit
          {
            Id = Guid.NewGuid(),
            IPAddress = request.UserHostAddress,
            UserId = id,
            Resource = request.RawUrl,
            Timestamp = DateTime.UtcNow
          };
    
          var database = (new NinjectBinder()).Kernel.Get();
          database.Audits.InsertOrUpdate(audit);
          database.Save();
        }
        catch (Exception e)
        {
          var username = WebSecurity.CurrentUserName;
          Debugging.DispatchExceptionEmail(e, username);
        }
      });
    
      base.OnActionExecuting(filterContext);
    }
    

提交回复
热议问题