Tôi có một tình huống mà, để thử nghiệm, tôi chỉ muốn phương pháp hẹn giờ của tôi (FooMethod) để chạy một tại một thời điểm. Trong ví dụ bên dưới, FooMethod được chuyển làm đại biểu cho bộ hẹn giờ. Có nhiều trường hợp cụ thể của lớp này. Tôi nghĩ rằng bằng cách làm cho _locker tĩnh, chỉ có một thể hiện của FooMethod() sẽ xử lý tại một thời điểm. Nhưng khi tôi chạy ứng dụng, nhiều luồng đang vượt qua dòng TryEnter() tại một thời điểm.Monitor.TryEnter với Generic Class
Đây là cách tôi thêm từng lớp vào bộ hẹn giờ mới. Này được thực hiện, trong vòng một, cho mỗi trường hợp foo:
_timers.Add(new Timer(foo.FooMethod, null, 0, 10000));
Và đây là lớp học mà có phương pháp đó:
public class Foo<T>
{
private static readonly object _locker = new object();
public void FooMethod(object stateInfo)
{
// Don't let threads back up; just get out
if (!Monitor.TryEnter(_locker)) { return; }
try
{
// Logic here
}
finally
{
Monitor.Exit(_locker);
}
}
}
Lưu ý: Thông thường, _locker không phải là tĩnh; Tôi không muốn cùng một thread vào phương thức trước khi nó có cơ hội hoàn thành. Tôi đã đổi nó thành tĩnh để thử nghiệm.
Suy nghĩ đầu tiên của tôi là có thể điều này không hiệu quả vì lớp học là chung chung? Và rằng mỗi lớp cụ thể thực sự là lớp riêng của nó và chúng không chia sẻ biến _locker? Điều đó có đúng không? Nếu đó là sự thật làm thế nào tôi nên có các lớp cụ thể chia sẻ một biến _locker? Tôi có cần phải thêm biến _locker tĩnh vào một số lớp khác mà Foos có quyền truy cập không?
câu hỏi rất thú vị và được hỏi rõ. +1 – spender
Lưu ý rằng cùng một chuỗi * có thể * nhập lại một khóa (nhưng chỉ khi có một số đệ quy, tất nhiên).Đó là những gì khóa được cho: ngăn chặn * khác nhau * chủ đề từ việc sử dụng cùng một nguồn tài nguyên. – phoog
@spender Cảm ơn bạn. Và phoog, tôi hiểu. Mục tiêu của tôi với biến tĩnh là ngăn chặn nhiều luồng xử lý phương thức đó cùng một lúc. Nhưng điều đó không hiệu quả. –