Tôi đang làm việc trên một cơ sở mã rất lớn và cũ của ứng dụng biểu mẫu máy tính để bàn. Trong cơ sở mã này có rất nhiều hoạt động được thực hiện trong các chủ đề nền, chủ yếu là sử dụng BackgroundWorker
.Hiệu ứng của AsyncLocal <T> trong mã không đồng bộ/chờ đợi là gì?
Một mẫu phổ biến trong cơ sở mã này, là để che giấu sự phức tạp bằng các tạo phẩm ràng buộc với chuỗi đang được thực hiện. Ví dụ, kết nối cơ sở dữ liệu và giao dịch được lưu trữ trong các trường [ThreadStatic]
.
Tôi đang cố thay đổi điều này và bắt đầu sử dụng mã async/await
và hưởng lợi từ việc chạy tác vụ trong bất kỳ chủ đề nào của hồ bơi và cho phép tác vụ tiếp tục thực hiện trong bất kỳ chủ đề nào khác bằng cách sử dụng ConfigureAwait(false)
. Tôi biết rằng [ThreadStatic]
không hoạt động tốt với async/await
và tôi đã đọc một số câu trả lời ở đây đề xuất sử dụng AsyncLocal<T>
thay thế.
Vì tôi đang làm việc trên một cơ sở mã lớn, như đã đề cập trước đây, tôi không thể chuyển sang async/await
ở khắp mọi nơi trong một lần chụp và tôi phải thực hiện thay đổi dần dần. Vì vậy, mã trước đó có [ThreadStatic]
sẽ thay đổi thành AsyncLocal<T>
, nhưng phần lớn mã sẽ tiếp tục sử dụng BackgroundWorker
và sẽ không trúng một dòng mã đơn lẻ async/await
.
Câu hỏi
Điều này có hiệu quả không? Tôi cần có thể xác định một số loại luồng ngữ cảnh sẽ hoạt động với mã mới async/await
của mình và tiếp tục làm việc với mã không đồng bộ cũ của tôi dựa trên số [ThreadStatic]
giữ mọi công cụ chủ đề độc lập với nhau.
Nếu tôi hoàn toàn sai và đi sai đường dẫn, đề xuất rất được hoan nghênh.