Tôi có một bộ điều khiển ASP.NET Web API mà tôi sẽ có nghĩ sẽ hoạt động không đồng bộ. Bộ điều khiển được thiết kế để ngủ 20 giây cho yêu cầu đầu tiên, nhưng dịch vụ bất kỳ yêu cầu tiếp theo ngay lập tức. Vì vậy, thời gian dự đoán của tôi sẽ là một cái gì đó như:Tại sao bộ điều khiển API Web async của tôi chặn luồng chính?
- yêu cầu Raise 1.
- Raise yêu cầu 2.
- yêu cầu Raise 3.
- Yêu cầu 2 lợi nhuận.
- Yêu cầu 3 lần trả lại.
- Chờ ~ 20 giây.
- Yêu cầu 1 lần trả lại.
Thay vào đó, không yêu cầu trả lại cho đến khi yêu cầu 1 hoàn tất.
Tôi có thể xác nhận (dựa trên các kết quả đầu ra gỡ lỗi), rằng chuỗi mục nhập và id chuỗi buồn ngủ khác nhau. Tôi đã cố tình sử dụng TaskCreationOptions.LongRunning
để buộc ngủ vào một luồng riêng biệt, nhưng vẫn ứng dụng từ chối phục vụ bất kỳ yêu cầu mới nào cho đến khi giấc ngủ đó kết thúc.
Tôi có thiếu cái gì cơ bản về cách bộ điều khiển API Web không đồng bộ thực sự hoạt động không?
public class ValuesController : ApiController
{
private static bool _firstTime = true;
public async Task<string> Get()
{
Debug.WriteLine("Entry thread id: {0}. Sync: {1}",
Thread.CurrentThread.ManagedThreadId,
SynchronizationContext.Current);
await LongWaitAsync();
return "FOOBAR";
}
private Task LongWaitAsync()
{
return Task.Factory.StartNew(() =>
{
if (_firstTime)
{
_firstTime = false;
Debug.WriteLine("Sleepy thread id: {0}. Sync: {1}",
Thread.CurrentThread.ManagedThreadId,
SynchronizationContext.Current);
Thread.Sleep(20000);
Debug.WriteLine("Finished sleeping");
}
},
CancellationToken.None,
TaskCreationOptions.LongRunning,
TaskScheduler.Default);
}
}
Là bước đầu tiên, tôi đánh dấu '_firstTime' là' volatile', để đảm bảo rằng các luồng riêng biệt có thể thấy nó thay đổi một cách nhất quán. –
Bạn đang sử dụng máy chủ web nào để lưu trữ? –
Đánh dấu '_firstTime' là' volatile' làm cho không có sự khác biệt. Tôi đã thử lưu trữ trong IIS Express 8.0 và IIS 7.5, cả trên Win 7 Pro. – Snixtor