Tôi có đoạn code WebAPI kiểm tra sau, tôi không sử dụng WebAPI trong sản xuất nhưng tôi làm điều này vì một cuộc thảo luận tôi đã về câu hỏi này: WebAPI Async questionTại sao HttpContext.Current null sau khi đang chờ?
Anyways, đây là phương pháp vi phạm WebAPI:
public async Task<string> Get(int id)
{
var x = HttpContext.Current;
if (x == null)
{
// not thrown
throw new ArgumentException("HttpContext.Current is null");
}
await Task.Run(() => { Task.Delay(500); id = 3; });
x = HttpContext.Current;
if (x == null)
{
// thrown
throw new ArgumentException("HttpContext.Current is null");
}
return "value";
}
Tôi đã tin rằng ngoại lệ thứ hai được mong đợi bởi vì khi hoàn tất, nó có thể sẽ nằm trên một luồng khác, trong đó HttpContext.Current
làm biến chủ đề sẽ không còn giải quyết cho giá trị thích hợp nữa. Bây giờ, dựa trên bối cảnh đồng bộ hóa, nó thực sự có thể bị buộc quay trở lại cùng một luồng sau khi chờ đợi nhưng tôi không làm bất cứ điều gì lạ mắt trong thử nghiệm của mình. Đây chỉ là cách sử dụng đơn giản, ngây thơ của await
.
Trong nhận xét trong câu hỏi khác, tôi được thông báo rằng HttpContext.Current
sẽ giải quyết sau một thời gian chờ đợi. Thậm chí còn có một bình luận khác về câu hỏi này cho thấy tương tự. Vì vậy, những gì là sự thật? Nó có nên giải quyết không? Tôi nghĩ không, nhưng tôi muốn có một câu trả lời có thẩm quyền về điều này bởi vì async
và await
là đủ mới mà tôi không thể tìm thấy bất kỳ điều gì dứt khoát.
TL; DR: Có phải HttpContext.Current
có khả năng null
sau await
?
Câu hỏi của bạn không rõ ràng - bạn đã nói những gì bạn mong đợi sẽ xảy ra và nhận xét cho biết rằng * là * điều gì đang xảy ra ... vậy điều gì khiến bạn khó hiểu? –
@ user2674389, điều này gây hiểu nhầm. Đó là 'AspNetSynchronizationContext' sẽ xử lý' HttpContext', không phải 'đang chờ '. Hơn nữa, việc gọi lại liên tục cho 'await' có thể (và rất có thể sẽ xảy ra) trên một luồng khác cho mô hình thực thi API Web. – Noseratio
được chỉnh sửa để đặt câu hỏi ngắn gọn – welegan