Tôi có mã WebAPI thử nghiệm sau, tôi không sử dụng WebAPI trong sản xuất nhưng tôi thực hiện điều này vì tôi đã có một cuộc thảo luận về câu hỏi này: Câu hỏi về WebAPI Async
Dù sao, đây là phương pháp WebAPI vi phạm:
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";
}
Ở đây tôi tin rằng ngoại lệ thứ hai được mong đợi bởi vì khi await
hoàn tất, nó có thể sẽ nằm trên một luồng khác, nơi HttpContext.Current
một biến tĩnh của luồng sẽ không còn phân giải thành giá trị thích hợp. 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 lại cùng một chuỗi sau thời gian chờ đợi nhưng tôi không làm bất cứ điều gì ưa thích trong thử nghiệm của mình. Đây chỉ là một cách sử dụng đơn giản, ngây thơ await
.
Trong các nhận xét trong một câu hỏi khác, tôi đã được nói rằng HttpContext.Current
sẽ giải quyết sau một thời gian chờ đợi. Thậm chí có một bình luận khác về câu hỏi này cho thấy điều tương tự. Vậy sự thật là gì? Nó có nên giải quyết? Tôi nghĩ là không, nhưng tôi muốn một câu trả lời có thẩm quyền về điều này bởi vì async
và await
đủ mới để tôi không thể tìm thấy bất cứ điều gì dứt khoát.
TL; DR: Có HttpContext.Current
khả năng null
sau một await
?