Tôi đang làm việc trên ứng dụng API Web kết nối với hệ thống phụ trợ qua API. Một thách thức khi làm việc với API là nó đòi hỏi một phiên làm việc từ xa để được duy trì được chia sẻ giữa tất cả các luồng/yêu cầu tới API Web. Phiên hết hạn sau mỗi vài giờ và cần được "làm mới" thông qua thông tin đăng nhập.Truy cập đa luồng .NET vào Phiên đăng nhập được chia sẻ
Một phiên bản đơn giản thực hiện hiện tại của tôi là dưới đây:
private static Object loginLock = new Object();
if(!Api.IsLoggedIn)
{
lock(loginLock)
{
if(!Api.IsLoggedIn)
{
Api.Login();
}
}
}
// Do stuff with the API
Dưới đồng thời tải cao, khi một tên đăng nhập là cần thiết, chủ đề được xếp chồng lên nhau tại khóa và được cho qua một lúc sau khi một thành công đăng nhập đang gây ra một nút cổ chai hiệu suất.
Những gì tôi đang tìm kiếm là cách chặn tất cả các chuỗi khi đăng nhập là bắt buộc, nhưng hãy để chúng hoàn thành khi đăng nhập thành công.
Có mô hình nào tốt hơn để giải quyết vấn đề này không? Googling dường như chỉ ra rằng ReaderWriterLockSlim
hoặc Monitor Wait/Pulse/PulseAll
có thể là ứng cử viên tốt hơn so với khóa tiêu chuẩn.
Vì tò mò, điều gì sẽ xảy ra khi phiên hết hạn sau khi kiểm tra 'Api.IsLoggedIn' nhưng trước khi sử dụng Api thực tế? –
Cuộc gọi API sẽ không thành công với lỗi "không có phiên hợp lệ", nhưng chúng tôi chưa thấy trường hợp đó (cho đến nay). – WayneC
Chính xác thì vấn đề là gì? Yêu cầu xếp hàng dường như không thể tránh khỏi. Nhưng một khi phiên họp trở nên có sẵn, hàng đợi sẽ rõ ràng cực kỳ nhanh chóng. Giống như một triệu sợi mỗi giây hoặc lâu hơn. – usr