use*_*761 14 asp.net asynchronous task global-asax
我需要在Global.asax中调用我的数据库上的一些异步操作.例如在Application_AuthenticateRequest中我需要针对数据库验证用户是否可以使用异步任务?
kar*_*ect 25
现在有一种更简单的方法:
public MvcApplication()
{
var wrapper = new EventHandlerTaskAsyncHelper(DoAsyncWork);
this.AddOnAuthenticateRequestAsync(wrapper.BeginEventHandler, wrapper.EndEventHandler);
}
private async Task DoAsyncWork(object sender, EventArgs e)
{
var app = (HttpApplication)sender;
var ctx = app.Context;
...
await doSomethingAsync();
}
Run Code Online (Sandbox Code Playgroud)
使用此方法,您可以使用async关键字定义方法,并使用"EventHandlerTaskAsyncHelper"类包装该方法,以生成BeginEventHandler和EndEventHandler方法以传递到AddOnAuthenticateRequestAsync调用.
我没有找到使用新的 C# 关键字 async 和 wait 的方法,但我们仍然可以使用 APM 模式在 Global.asax 中使用异步操作,因为它实现了 IHttpAsyncHandler 接口。这是一个演示异步的小代码,这里我使用 WebRequst 作为示例,在您的情况下,请改用数据库操作。
public Global()
{
this.AddOnAuthenticateRequestAsync(BeginGetAsyncData, EndGetAsyncData);
}
IAsyncResult BeginGetAsyncData(Object src, EventArgs args, AsyncCallback cb, Object state)
{
Console.WriteLine("BeginGetAsyncData: thread #" + System.Threading.Thread.CurrentThread.ManagedThreadId);
WebRequest request = WebRequest.Create("http://www.google.com");
return request.BeginGetResponse(cb, request); // call database async operation like SqlCommand.BeginExecuteReader()
}
void EndGetAsyncData(IAsyncResult ar)
{
Console.WriteLine("EndGetAsyncData: thread #" + System.Threading.Thread.CurrentThread.ManagedThreadId);
WebRequest requst = (WebRequest)ar.AsyncState;
System.Net.WebResponse response = requst.EndGetResponse(ar); // call database async operation like SqlCommand.EndExecuteReader()
Console.WriteLine(new StreamReader(response.GetResponseStream()).ReadToEnd());
response.Close();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
5482 次 |
最近记录: |