2009-06-16 31 views
5

Tôi có khóa trong mã của mình.
Tôi có hai chuỗi chạy cùng một lúc. Làm cách nào để biết chuỗi có đang khóa đối tượng đó không?Làm thế nào để tìm ra nếu một đối tượng bị khóa? C#

private readonly object _lockObject = new Object(); 

// Both methods running 
public void Method1() 
{ 
    if(certainCriteria) 
    { 
     lock(_lockObject) 
     { 
     //doWork; 
     } 
    } 
} 

// Both methods running 
public void Method2() 
{ 
    if(isLocked?(_lockObject)) 
    { 
     //doWork; 
    } 
} 

Có ai có được khóa không? phương pháp?

Cảm ơn trước!

Trả lời

8

Bạn thể sử dụng Monitor.TryEnter (hoặc với một thời gian chờ là 0, hoặc sự quá tải mà không mất một thời gian chờ gì cả) và sau đó ngay lập tức gọi Monitor.Exit nếu nó thành công - nhưng tôi muốn nói điều này nói chung là một xấu mùi thiết kế. Đặc biệt, dữ liệu là cũ ngay lập tức bạn trả lại nó.

Bạn đang cố gắng đạt được điều gì?

+0

@Jon: Yaow quá nhanh, yaaw (đọc tốt hơn nếu bạn có thể quản lý giọng đen của quốc gia). Đó là những gì tôi sẽ đề nghị với một cảnh báo lớn "Nó hoạt động trên cơ sở chúng ta" biết "làm thế nào khóa hoạt động". – AnthonyWJones

+0

Tôi không đặc biệt lo lắng bởi thực tế là nó phụ thuộc vào việc biết làm thế nào khóa hoạt động - nó không giống như đó là sẽ thay đổi. Nó chỉ là nó cảm thấy đồng bằng sai. Tôi dám nói rằng có một số * tình huống hữu ích, nhưng có lẽ ít hơn những nơi thực sự được sử dụng! –

+0

Xin chào Jon! Tôi đang triển khai một BufferManager. Về cơ bản nó có một Stack of Buffers. Khi một chủ đề pop() s ngăn xếp và nó là trống rỗng - Tôi muốn tất cả các chủ đề để chờ đợi trên pop tiếp theo của họ() trong khi một chủ đề đầy lên ngăn xếp. Sau khi điền - tất cả các chủ đề khác để tiếp tục bật. Tôi không chắc chắn về cơ chế khóa C# mặc dù! – divinci

Các vấn đề liên quan