Tôi cần gọi một số hoạt động không đồng bộ trên DB của mình trong Global.asax. ví dụ trong Application_AuthenticateRequest Tôi cần xác thực người dùng dựa trên DB Có thể thực hiện với các tác vụ không đồng bộ không?ASP.NET: Có thể gọi Công việc không đồng bộ trong Global.asax không?
Trả lời
Tôi không tìm cách sử dụng từ khóa C# mới và không cần chờ đợi, nhưng chúng tôi vẫn có thể sử dụng mẫu APM để sử dụng các hoạt động không đồng bộ trong Global.asax vì nó triển khai giao diện IHttpAsyncHandler. Đây là một mã nhỏ để demo async, ở đây tôi sử dụng một WebRequst làm ví dụ, trong trường hợp của bạn hãy sử dụng hoạt động cơ sở dữ liệu để thay thế.
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();
}
Cảm ơn! Tôi đã tìm thấy :) [http://www.codeproject.com/Articles/373479/Writing-asynchronous-HTTP-Module-in-ASP-NET-4-5](http://www.codeproject. com/Các bài viết/373479/Viết-không đồng bộ-HTTP-Mô-đun-trong-ASP-NET-4-5) – user1328761
Bạn phải thêm phiên bản async của AuthenticateRequest. Sử dụng đoạn mã sau:
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);
}
Vấn đề là sau đó, làm thế nào để thực hiện BeginAuthenticateRequest
và EndAuthenticateRequest
sử dụng async mới/đang chờ đợi các tính năng của C#. Đầu tiên, chúng ta hãy phiên bản async của chúng ta về AuthenticateRequest ra khỏi con đường:
private async Task AuthenticateRequestAsync(object sender, EventArgs args)
{
// Yay, let's do async stuff!
await ...
}
gì chúng ta cần làm tiếp theo là đưa ra một thực hiện BeginAuthenticateRequest và EndAuthenticateRequest. Tôi đi theo a blog post, nhưng có nguồn gốc thực của riêng tôi:
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;
}
Bạn có thể đọc toàn bộ bài viết liên quan đến xem làm thế nào nó hoạt động, nhưng về cơ bản IAsyncResult
được thực hiện bởi công tác, vì vậy tất cả các bạn phải làm là gọi callback khi thực hiện xong .
Các bit cuối cùng là chết dễ dàng:
private void EndAuthenticateRequest(IAsyncResult result)
{
// Nothing to do here.
}
Có một cách dễ dàng hơn để làm điều này bây giờ:
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();
}
Với phương pháp này, bạn định nghĩa một phương pháp sử dụng các từ khóa async và quấn phương pháp mà sử dụng lớp 'EventHandlerTaskAsyncHelper' để tạo các phương thức BeginEventHandler và EndEventHandler để chuyển vào cuộc gọi AddOnAuthenticateRequestAsync.
- 1. ASP.NET MVC không gọi global.asax 'EndRequest
- 2. Gọi lại không đồng bộ đồng thời
- 3. Đồng bộ hóa cuộc gọi không đồng bộ trong C#
- 4. TaskCompletionSource - Cố gắng hiểu công việc không đồng bộ không có chuỗi
- 5. Cuộc gọi không đồng bộ trong WP7
- 6. Postback không đồng bộ và đồng bộ trong ASP.NET
- 7. @ Không đồng bộ không dẫn đến việc gọi async không đồng bộ của phương thức EJB trong JBossAS7
- 8. Gọi hàm không đồng bộ trong PHP
- 9. Đợi công việc không đồng bộ mà không bao gồm ngoại lệ trong AggregateException
- 10. Làm cách nào tôi có thể chờ một phương thức không đồng bộ mà không có công cụ sửa đổi không đồng bộ trong phương thức gốc này?
- 11. chiến lược để gọi dịch vụ đồng bộ gọi không đồng bộ trong C#
- 12. Có thể gỡ lỗi Global.asax không?
- 13. Gọi lại đồng bộ và không đồng bộ
- 14. Có giới hạn về số lượng cuộc gọi urlfetch không đồng bộ mà tôi có thể chạy đồng thời không?
- 15. Bộ điều khiển không đồng bộ trong ASP.NET MVC
- 16. Threading nhiều cuộc gọi không đồng bộ
- 17. Chúng tôi có thể kiểm tra đơn vị global.asax trong asp.net không?
- 18. Hủy cuộc gọi EJB không đồng bộ @
- 19. Cuộc gọi ủy nhiệm không đồng bộ về lửa và không đồng bộ trong C#
- 20. xử lý không đồng bộ với PHP - một công nhân cho mỗi công việc
- 21. Có thể chuyển một cuộc gọi lại thành một khối không đồng bộ không?
- 22. global.asax breakpoint không trúng
- 23. Có thể hủy bỏ XmlHttpRequest đồng bộ không?
- 24. Asp.net System.Web.HttpContext.Current.Session null trong global.asax
- 25. Gọi không đồng bộ - Yêu cầu EndInvoke phải không?
- 26. Trạng thái toàn cầu và Quy trình công việc không đồng bộ trong F #
- 27. Quá trình không đồng bộ gọi
- 28. Mạo danh và không đồng bộ của trong ASP.NET WebAPI
- 29. Cách thích hợp để gửi email không đồng bộ trong ASP.NET ... (Tôi có làm đúng không?)
- 30. Làm cách nào để gọi các phương thức không đồng bộ trong asp.net C# 4.0?
Tại sao bạn muốn xác thực không đồng bộ? Không nên được thực hiện đồng bộ? – Rich
bởi vì trên nhiều người dùng yêu cầu các cuộc gọi sychronouse đến DB cho người khác yêu cầu phải được xếp vào hàng đợi - nó tăng thời gian phản hồi. xem [Cuộc gọi cơ sở dữ liệu không đồng bộ với mô hình lập trình không đồng bộ dựa trên nhiệm vụ (TAP) trong ASP.NET MVC 4] (http://www.tugberkugurlu.com/archive/asynchronous-database-calls-with-task-based-asynchronous -programming-model-tap-in-asp-net-mvc-4) – user1328761
Chúng tôi quản lý để tăng thông lượng của chúng tôi bằng cách xử lý AuthenticateRequest không đồng bộ. Không cần chuỗi bị chặn bởi mạng. –