2013-02-22 39 views
6

Một phần của việc chuyển một ứng dụng Java sang C# là triển khai bộ đệm thông báo được đồng bộ hóa trong C#. Bằng cách đồng bộ, tôi có nghĩa là phải an toàn cho các chủ đề để viết và đọc các tin nhắn đến và từ đó.Các phương thức đồng bộ trong C#

Trong Java, điều này có thể được giải quyết bằng cách sử dụng các phương pháp synchronizedwait()notifyAll().

Ví dụ:

public class MessageBuffer { 
    // Shared resources up here 

    public MessageBuffer() { 
     // Initiating the shared resources 
    } 

    public synchronized void post(Object obj) { 
     // Do stuff 
     wait(); 
     // Do more stuff 
     notifyAll(); 
     // Do even more stuff 
    } 

    public synchronized Object fetch() { 
     // Do stuff 
     wait(); 
     // Do more stuff 
     notifyAll(); 
     // Do even more stuff and return the object 
    } 
} 

Làm thế nào tôi có thể đạt được một cái gì đó tương tự như trong C#?

+1

liên quan: http://stackoverflow.com/questions/541194/c-sharp-version-of-javas-synchronized-keyword – sshow

+0

@stigok không liên quan, đó là một bản sao –

+0

Không lặp lại, họ đã không đề cập wait() và thông báoAll() – Dimme

Trả lời

4

Hãy thử điều này:

using System.Runtime.CompilerServices; 
using System.Threading; 

public class MessageBuffer 
{ 
    // Shared resources up here 

    public MessageBuffer() 
    { 
     // Initiating the shared resources 
    } 

    [MethodImpl(MethodImplOptions.Synchronized)] 
    public virtual void post(object obj) 
    { 
     // Do stuff 
     Monitor.Wait(this); 
     // Do more stuff 
     Monitor.PulseAll(this); 
     // Do even more stuff 
    } 

    [MethodImpl(MethodImplOptions.Synchronized)] 
    public virtual object fetch() 
    { 
     // Do stuff 
     Monitor.Wait(this); 
     // Do more stuff 
     Monitor.PulseAll(this); 
     // Do even more stuff and return the object 
    } 
} 
+3

Tôi không thích sử dụng MethodImplOptions.Synchronized vì nó tương đương với " khóa này "cho mỗi phương pháp. Và "khóa này" được coi là một chút tinh ranh bởi vì nó làm tăng khả năng bế tắc. –

+1

Tôi đồng ý với @MatthewWatson. Bạn nên tránh MethodImplOptions.Synchronized và thay vào đó sử dụng khóa rõ ràng. – Patrik

+0

Câu hỏi đặt ra là làm thế nào để đạt được điều này trong C#, chứ không phải điều gì sẽ thích hợp hơn. –

6

Trong .NET, bạn có thể sử dụng lock -statement như trong

object oLock = new object(); 
lock(oLock){ 
    //do your stuff here 
} 

gì bạn đang tìm kiếm là mutexes hoặc các sự kiện. Bạn có thể sử dụng ManualResetEvent đẳng cấp và thực hiện một chờ đợi tuyến qua

ManualResetEvent mre = new ManualResetEvent(false); 
... 
mre.WaitOne(); 

Các chủ đề khác cuối cùng gọi

mre.Set(); 

để báo hiệu các chủ đề khác mà nó có thể tiếp tục.

Nhìn here.

+0

Có thể 'ManualResetEvent' được thay thế cho một semaphore' Mutex' không? – Dimme

+1

Có, nhưng bạn sẽ cần hai trong số đó. Một cho báo hiệu mỗi luồng. Theo cách này, khi một thread tạo ra một đối tượng để báo hiệu điều này và thứ hai để báo hiệu rằng đối tượng đã được tiêu thụ. Tất nhiên, nếu bạn muốn tạo nhiều đối tượng, bạn có thể chọn cách tiếp cận khác. Nó phụ thuộc vào tình hình. Nhưng Sự kiện phù hợp với nhiều tình huống. Vui lòng xem tài liệu trên [MSDN] (http://msdn.microsoft.com/en-us/library/ms173179.aspx). –

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