Giả sử tôi có một lớp học triển khai giao diện IDisposable. Một cái gì đó như thế này:Cách xử lý không đồng bộ?
MyClass sử dụng một số nguồn lực không được quản lý, vì thế mà Dispose() phương pháp từ IDisposable phát hành những tài nguyên. MyClass nên được sử dụng như thế này:
using (MyClass myClass = new MyClass()) {
myClass.DoSomething();
}
Bây giờ, tôi muốn thực hiện một phương pháp mà các cuộc gọi DoSomething() không đồng bộ. Tôi thêm một phương pháp mới để MyClass:
Bây giờ, từ phía khách hàng, MyClass nên được sử dụng như thế này:
using (MyClass myClass = new MyClass()) {
myClass.AsyncDoSomething();
}
Tuy nhiên, nếu tôi không làm bất cứ điều gì khác, điều này có thể không thành đối tượng myClass có thể được xử lý trước DoSomething() được gọi (và ném một bất ngờ ObjectDisposedException). Vì vậy, cuộc gọi đến phương thức Vứt bỏ() (ngầm hoặc rõ ràng) sẽ bị trì hoãn cho đến khi cuộc gọi không đồng bộ đến DoSomething() được thực hiện.
Tôi nghĩ rằng các mã trong phương pháp Dispose() nên được thực hiện một cách đồng bộ, và chỉ khi tất cả các cuộc gọi không đồng bộ được giải quyết. Tôi muốn biết đó có thể là cách tốt nhất để thực hiện điều này.
Cảm ơn.
LƯU Ý: Vì mục đích đơn giản, tôi chưa nhập chi tiết về cách phương thức Dispose() được triển khai. Trong cuộc sống thực, tôi thường theo dõi Dispose pattern.
UPDATE: Cảm ơn bạn rất nhiều vì đã trả lời của bạn. Tôi đánh giá cao nỗ lực của bạn. Là chakrithas commented, tôi cần rằng nhiều cuộc gọi đến DoSomething không đồng bộ có thể được thực hiện. Lý tưởng nhất, một cái gì đó như thế này sẽ hoạt động tốt:
using (MyClass myClass = new MyClass()) {
myClass.AsyncDoSomething();
myClass.AsyncDoSomething();
}
Tôi sẽ nghiên cứu semaphore đếm, có vẻ như những gì tôi đang tìm kiếm. Nó cũng có thể là một vấn đề thiết kế. Nếu tôi tìm thấy nó thuận tiện, tôi sẽ chia sẻ với bạn một số bit của trường hợp thực tế và những gì MyClass thực sự.
Trong việc sử dụng (MyClass myclass = new ....) Ví dụ tôi nghĩ rằng đối tượng myclass trở nên chưa được đặt ở cuối khối sử dụng và có sẵn để được hoàn thành. Tôi khá chắc chắn để được an toàn, bạn cần phải gọi và chặn trên một phương pháp chờ đợi trước khi kết thúc khối sử dụng. –