Cập nhật: ASP.NET Core không có aSynchronizationContext
. Nếu bạn đang sử dụng ASP.NET Core, việc bạn có sử dụng ConfigureAwait(false)
hay không không quan trọng.
Đối với ASP.NET "Full" hoặc "Classic" hoặc bất cứ điều gì, phần còn lại của câu trả lời này vẫn được áp dụng.
Bài gốc (đối với ASP.NET không phải Core):
Video này của nhóm ASP.NET có thông tin tốt nhất về việc sử dụng async
trên ASP.NET.
Tôi đã đọc được rằng nó hiệu quả hơn vì nó không phải chuyển ngữ cảnh luồng trở lại bối cảnh luồng gốc.
Điều này đúng với các ứng dụng UI, nơi chỉ có một luồng UI mà bạn phải "đồng bộ hóa" trở lại.
Trong ASP.NET, tình hình phức tạp hơn một chút. Khi một async
phương thức tiếp tục thực thi, nó lấy một luồng từ nhóm luồng ASP.NET. Nếu bạn vô hiệu hóa việc chụp bối cảnh bằng cách sử dụng ConfigureAwait(false)
, thì luồng sẽ tiếp tục thực thi phương thức trực tiếp. Nếu bạn không tắt chức năng chụp ngữ cảnh, thì luồng sẽ nhập lại ngữ cảnh yêu cầu và sau đó tiếp tục thực thi phương thức.
Vì vậy, ConfigureAwait(false)
không tiết kiệm cho bạn một bước nhảy trong ASP.NET; nó giúp bạn tiết kiệm nhập lại bối cảnh yêu cầu, nhưng điều này thường rất nhanh. ConfigureAwait(false)
có thể hữu ích nếu bạn đang cố gắng thực hiện một lượng nhỏ xử lý song song một yêu cầu, nhưng thực sự TPL phù hợp hơn với hầu hết các kịch bản đó.
Tuy nhiên, với ASP.NET Web Api, nếu yêu cầu của bạn xuất hiện trên một luồng và bạn đang chờ một số chức năng và gọi ConfigureAwait (false) có khả năng đưa bạn vào một luồng khác khi bạn trả về kết quả cuối cùng của chức năng ApiControll của bạn .
Trên thực tế, chỉ cần làm một await
có thể làm điều đó. Khi async
phương thức của bạn chạm một await
, phương thức bị chặn nhưng luồng sẽ quay trở lại nhóm luồng. Khi phương thức đã sẵn sàng để tiếp tục, bất kỳ luồng nào được lấy từ nhóm luồng và được sử dụng để tiếp tục phương thức.
Sự khác biệt duy nhất ConfigureAwait
làm cho ASP.NET là liệu luồng đó có vào ngữ cảnh yêu cầu khi tiếp tục phương thức hay không.
Tôi có thêm thông tin cơ bản trong bài viết MSDNSynchronizationContext
của tôi trên và async
bài đăng blog giới thiệu của tôi .
HttpContext.Current
được lưu chuyển bởi ASP.NETSynchronizationContext
, được chảy theo mặc định khi bạnawait
, nhưng nó không được chảy theoContinueWith
. OTOH, bối cảnh thực thi (bao gồm các hạn chế bảo mật) là bối cảnh được đề cập trong CLR thông qua C # và được truyền bởi cả haiContinueWith
vàawait
(ngay cả khi bạn sử dụngConfigureAwait(false)
).