2013-02-20 31 views
7

Tôi có một lớp học với ba phương pháp này. Lớp này được nhiều chủ đề sử dụng. Tôi muốn Method1 đợi, nếu Method2 và/hoặc Method3 đang chạy trong bất kỳ chủ đề nào. Bất kỳ đề xuất nào?Khóa phương pháp trong C#

public class Class1 
{ 
    public static void Method1() 
    { 
     Object lockThis = new Object(); 

     lock (lockThis) 
     { 
      //Body function 
     } 
    } 

    public static void Method2() 
    { 
     //Body function 
    } 

    public static void Method3() 
    { 
     //Body function 
    } 
} 
+1

Method2 và Method3 có thể thực thi đồng thời? Và/hoặc ngụ ý rằng theo một cách nào đó. –

Trả lời

8

Nếu tôi hiểu đúng, bạn cần một cái gì đó như thế này:

static object lockMethod2 = new object(); 
static object lockMethod3 = new object(); 

public static void Method1() 
{ 
    lock (lockMethod2) 
    lock (lockMethod3) 
    { 
     //Body function 
    } 
} 

public static void Method2() 
{ 
    lock (lockMethod2) 
    { 
     //Body function 
    } 
} 

public static void Method3() 
{ 
    lock (lockMethod3) 
    { 
     //Body function 
    } 
} 

này cho phép method3 để thực thi nếu method2 đang chạy và ngược lại, trong khi method1 phải đợi cho cả hai. Tất nhiên, method2 và 3 sẽ không chạy trong khi 1 đang chạy.

+0

@ Grumbler85: vâng, cảm ơn, tôi đã bỏ lỡ thực tế rằng các phương pháp là tĩnh ... –

3

Nếu bạn đa luồng thì bạn phải truy cập được lock cho tất cả các chuỗi. Vì vậy, trong trường hợp này, ổ khóa của bạn cần phải tĩnh cho các phương thức tĩnh để xem nó.

Thiết lập hiện tại của bạn sẽ tạo đối tượng khóa mới cho mỗi chuỗi. Do đó, cung cấp đồng bộ hóa ngay bây giờ.

8

Việc triển khai khóa hiện tại của bạn hoàn toàn vô dụng, bởi vì mỗi chuỗi sẽ khóa trên một đối tượng khác.
Việc khóa thường được thực hiện với trường chỉ đọc được khởi tạo chỉ một lần.
Như thế này, bạn có thể dễ dàng khóa nhiều phương pháp:

public class Class1 
{ 
    private static readonly object _syncRoot = new object(); 

    public static void Method1() 
    { 
     lock (_syncRoot) 
     { 
      //Body function 
     } 
    } 

    public static void Method2() 
    { 
     lock (_syncRoot) 
     { 
      //Body function 
     } 
    } 

    public static void Method3() 
    { 
     lock (_syncRoot) 
     { 
      //Body function 
     } 
    } 
} 
6

tôi sẽ đề nghị một ReaderWriterLockSlim (http://msdn.microsoft.com/en-us/library/system.threading.readerwriterlockslim.aspx)

Tương tự như các hoạt động đọc, Phương pháp 2 và Method3 có thể xảy ra song song, trong khi Method1 (giống như một viết hoạt động) sẽ cần phải chờ đợi cho những người kết thúc. Đó không phải là tình huống đồng thời đọc/ghi thường xuyên, nhưng logic cũng tương tự.

public class Class1 
{ 
    private ReaderWriterLockSlim methodLock = new ReaderWriterLockSlim(); 
    public static void Method1() 
    { 
     methodLock.EnterWriteLock(); 
     try 
     { 
      //Body function 
     } 
     finally 
     { 
      cacheLock.ExitWriteLock(); 
     } 
    } 

    public static void Method2() 
    { 
     methodLock.EnterReadLock(); 
     try 
     { 
      //Body function 
     } 
     finally 
     { 
      methodLock.ExitReadLock(); 
     } 
    } 

    public static void Method3() 
    { 
     methodLock.EnterReadLock(); 
     try 
     { 
      //Body function 
     } 
     finally 
     { 
      methodLock.ExitReadLock(); 
     } 
    } 
} 
+0

+1, tôi không biết điều này :) –