Tôi biết đó là một câu hỏi phổ biến, nhưng tôi đã đọc một loạt các bài báo và cảm thấy bối rối. Và bây giờ tôi nghĩ rằng nó sẽ là tốt hơn không để đọc chúng ở tất cả)).ASP.NET và async - cách hoạt động?
Vì vậy, làm thế nào ASP.NET làm việc (chỉ khoảng đề):
- yêu cầu http được phục vụ bởi thread từ bể thread.
- trong khi yêu cầu đang xử lý chuỗi này đang bận, vì yêu cầu đang xử lý bên trong chính xác luồng này.
- khi yêu cầu xử lý hoàn tất, luồng trả về nhóm luồng, máy chủ gửi phản hồi.
Hành vi được mô tả này có đúng không?
Điều gì thực sự xảy ra khi tôi bắt đầu nhiệm vụ mới bên trong bộ điều khiển ASP.NET MVC?
public ActionResult Index()
{
var task1 = Task.Factory.StartNew(() => DoSomeHeavyWork());
return View();
}
private static async Task DoSomeHeavyWork()
{
await Task.Delay(5000);
}
- điều khiển hành động bắt đầu thực hiện trong chủ đề đó sẽ xử lý yêu cầu hiện tại - T1.
- nhóm luồng phân bổ một luồng khác (T2) cho nhiệm vụ 1.
- task1 bắt đầu "ngay lập tức" bên trong T2.
- Kết quả xem trả về "ngay lập tức".
- ASP.NET thực hiện một số công việc, máy chủ gửi phản hồi, T1 trở về nhóm chủ đề, T2 vẫn còn hoạt động.
- sau một thời gian khi DoSomeHeavyWork sẽ kết thúc, chuỗi T2 sẽ được trả về nhóm chủ đề.
Có đúng không?
Bây giờ cho phép nhìn vào hành động async
public async Task<ActionResult> Index()
{
await DoSomeHeavyWork();
return View();
}
, tôi hiểu sự khác biệt với mẫu mã trước đó, nhưng không phải là quá trình này, trong ví dụ này hành vi này là như sau:
- hành động bắt đầu thực thi bên trong luồng xử lý yêu cầu hiện tại - T1.
- DoSomeHeavyWork "ngay lập tức" trả về một tác vụ, hãy gọi nó là "task1".
- T1 trở về nhóm chủ đề.
- sau khi kết thúc DoSomeHeavyWork, hành động Index tiếp tục thực thi.
- sau khi thực thi hành động chỉ mục, máy chủ sẽ gửi phản hồi.
Xin giải thích những gì xảy ra giữa các điểm 2 và 5, các câu hỏi là:
- là DoSomeHeavyWork xử lý bên trong task1 hoặc nơi (nơi nó được "chờ đợi")? Tôi nghĩ đây là một câu hỏi quan trọng.
- chuỗi nào sẽ tiếp tục xử lý yêu cầu sau khi đang chờ - bất kỳ chủ đề nào mới từ nhóm chủ đề, phải không?
- yêu cầu tạo chuỗi phân bổ từ nhóm chủ đề, nhưng phản hồi sẽ không được gửi cho đến khi DoSomeHeavyWorkAsync kết thúc và không thành vấn đề trong đó chuỗi này thực thi. Nói cách khác, theo đơn yêu cầu và duy nhất nhiệm vụ cụ thể (DoSomeHeavyWork) không có lợi ích khi sử dụng async. Nó có đúng không ?
- nếu tuyên bố trước là chính xác, thì tôi không hiểu cách async có thể cải thiện hiệu suất cho nhiều yêu cầu với cùng một nhiệm vụ đơn. Tôi sẽ cố gắng giải thích. Giả sử rằng thread thread có 50 luồng có sẵn để xử lý các yêu cầu. Yêu cầu duy nhất phải được xử lý ít nhất bởi một chuỗi duy nhất từ nhóm chủ đề, nếu yêu cầu bắt đầu một luồng khác, thì tất cả chúng sẽ được lấy từ nhóm luồng, ví dụ: yêu cầu có một luồng để xử lý, bắt đầu 5 nhiệm vụ khác nhau song song chờ tất cả chúng, thread thread sẽ có 50 - 1 - 5 = 44 thread miễn phí để xử lý các yêu cầu gửi đến - vì vậy đây là một song song, chúng ta có thể cải thiện hiệu suất cho single yêu cầu, nhưng chúng tôi giảm số lượng yêu cầu có thể được xử lý. Vì vậy, theo yêu cầu chế biến trong ASP.NET tôi giả sử rằng chỉ có nhiệm vụ mà bằng cách nào đó bắt đầu IO hoàn thành chủ đề có thể đạt được một mục tiêu của async (TAP). Nhưng làm thế nào IO hoàn thành thread gọi lại thread thread thread trong trường hợp này?
'đang chờ đợi 'Một số câu trả lời có giá trị cho câu hỏi này. – Xmindz