我最近将我的项目升级到了 ASP.NET 4.5,并且我已经等待了很长时间来使用 4.5 的异步能力。阅读文档后,我不确定是否能够改进我的代码。
我想异步执行一个任务,然后忘记它。我目前使用的方法是创建委托,然后使用BeginInvoke。
这是我项目中的一个过滤器,在每次用户访问必须进行审计的资源时,在我们的数据库中创建一个审计记录:
我不需要异步调用的结果,因此我宁愿不使用回调。如何使用
我想异步执行一个任务,然后忘记它。我目前使用的方法是创建委托,然后使用BeginInvoke。
这是我项目中的一个过滤器,在每次用户访问必须进行审计的资源时,在我们的数据库中创建一个审计记录:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var request = filterContext.HttpContext.Request;
var id = WebSecurity.CurrentUserId;
var invoker = new MethodInvoker(delegate
{
var audit = new Audit
{
Id = Guid.NewGuid(),
IPAddress = request.UserHostAddress,
UserId = id,
Resource = request.RawUrl,
Timestamp = DateTime.UtcNow
};
var database = (new NinjectBinder()).Kernel.Get<IDatabaseWorker>();
database.Audits.InsertOrUpdate(audit);
database.Save();
});
invoker.BeginInvoke(StopAsynchronousMethod, invoker);
base.OnActionExecuting(filterContext);
}
但是为了完成这个异步任务,我需要总是定义一个回调函数,它看起来像这样:
public void StopAsynchronousMethod(IAsyncResult result)
{
var state = (MethodInvoker)result.AsyncState;
try
{
state.EndInvoke(result);
}
catch (Exception e)
{
var username = WebSecurity.CurrentUserName;
Debugging.DispatchExceptionEmail(e, username);
}
}
我不需要异步调用的结果,因此我宁愿不使用回调。如何使用
Task.Run()
(或async
和await
)改进此代码?