我需要在Global.asax中對我的數據庫調用一些異步操作。 例如在Application_AuthenticateRequest中我需要根據數據庫對用戶進行身份驗證 使用異步任務可能嗎?ASP.NET:是否可以在Global.asax中調用異步任務?
回答
我沒有找到一種方法來使用新的C#關鍵字異步和等待,但我們仍然可以使用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();
}
謝謝! 我發現:) [http://www.codeproject.com/Articles/373479/Writing-asynchronous-HTTP-Module-in-ASP-NET-4-5](http://www.codeproject。 COM /文章/ 373479 /寫作異步-HTTP-模塊式-ASP-NET-4-5) – user1328761
您必須自己添加異步版本的AuthenticateRequest。使用下面的代碼:
public MvcApplication()
{
// Contrary to popular belief, this is called multiple times, one for each 'pipeline' created to handle a request.
// Wire up the async authenticate request handler.
AddOnAuthenticateRequestAsync(BeginAuthenticateRequest, EndAuthenticateRequest, null);
}
的問題是,那麼,如何使用新的異步實現BeginAuthenticateRequest
和EndAuthenticateRequest
/等待的C#的特徵。首先,讓我們得到我們AuthenticateRequest的異步版本的出路:
private async Task AuthenticateRequestAsync(object sender, EventArgs args)
{
// Yay, let's do async stuff!
await ...
}
我們下一步需要做的就是拿出BeginAuthenticateRequest和EndAuthenticateRequest的實現。我跟着a blog post,但得到的我自己的實現:
private IAsyncResult BeginAuthenticateRequest(object sender, EventArgs args, AsyncCallback callback, object state)
{
Task task = AuthenticateRequestAsync(sender, args);
var tcs = new TaskCompletionSource<bool>(state);
task.ContinueWith(_ =>
{
if (task.IsFaulted && task.Exception != null) tcs.TrySetException(task.Exception.InnerExceptions);
else if (task.IsCanceled) tcs.TrySetCanceled();
else tcs.TrySetResult(true);
if (callback != null) callback(tcs.Task);
}, CancellationToken.None, TaskContinuationOptions.None, TaskScheduler.Default);
return tcs.Task;
}
你可以閱讀整個鏈接的文章,看看它是如何工作的,但基本上IAsyncResult
通過任務來實現,因此,所有你需要做的是完成時調用回調。
的最後一位是死很容易:
private void EndAuthenticateRequest(IAsyncResult result)
{
// Nothing to do here.
}
現在有這樣做一個簡單的方法:
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();
}
通過這種方法,您可以定義使用async關鍵字的方法和換行方法使用'EventHandlerTaskAsyncHelper'類生成BeginEventHandler和EndEventHandler方法以傳入AddOnAuthenticateRequestAsync調用。
- 1. 是否可以調試Global.asax?
- 2. 是可以使用異步任務
- 3. 是否可以限制節點中的異步任務?
- 4. 在ASP.NET異步頁面中,是否可以執行2個連續的異步任務?
- 5. ASP.NET中的異步任務
- 6. 是Global.asax Application_Error異步?
- 7. 在循環中調用異步任務?
- 8. 是否可以在ASP.NET中運行異步調用來設置會話?
- 9. App Engine:是否可以異步排隊任務?
- 10. 調用異步任務
- 11. 是否可以在非異步方法中調用awaitable方法?
- 12. ASP.NET任務異步WaitingForActivation
- 13. Android在另一個Async任務中調用異步任務?
- 14. ASP.NET MVC異步任務運行是否有意義?
- 15. 可以在類android中使用多少個異步任務?
- 16. ASP.NET Core中的異步任務
- 17. ASP.NET中的異步任務(C#)
- 18. 異步任務可以在循環中運行嗎? (在iOS中)
- 19. 我可以在Dart中異步調用非異步函數嗎?
- 20. 是否有可能在sparate線程中使用異步任務android
- 21. 在同步調用中執行異步任務
- 22. 是什麼異步任務和任務
- 23. asp.net中的異步調用
- 24. 你可以調用AudioObjectSetPropertyData是否同步?
- 25. 是否可以同步調用ngResource?
- 26. 是否可以通過異步管道調用類方法
- 27. Global.asax中的異步方法
- 28. 是否可以使用異步RESTful Web服務?
- 29. 是否有可能從javascript scriptdef任務中調用ant任務?
- 30. 是否有可能在jQuery中進行半異步ajax調用?
爲什麼你想異步認證?這不應該同步完成嗎? – Rich
,因爲在許多用戶請求對數據庫的同步調用後,其他請求者被放入隊列 - 這增加了響應時間。請參見[ASP.NET MVC 4中的基於任務的異步編程模型(TAP)中的異步數據庫調用](http://www.tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous -programming-model-tap-in-asp-net-mvc-4) – user1328761
我們設法通過異步處理AuthenticateRequest來提高吞吐量。不需要網絡阻止線程。 –