2013-02-22 15 views
6

JavaアプリケーションをC#に移植する作業の一部は、C#で同期メッセージバッファを実装することです。同期化すると、スレッドがメッセージの書き込みと読み取りを安全に行う必要があることを意味します。C#の同期メソッド

Javaでは、これは​​メソッドとwait()notifyAll()メソッドを使用して解決できます。

例:

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 
    } 
} 

どのように私はC#で似た何かを達成することができますか?

+1

関連:http://stackoverflow.com/questions/541194/c-sharp-version-of-javas-synchronized-keyword – sshow

+0

@stigok関連していない、重複しています –

+0

重複していない、wait()そして、notifyAll() – Dimme

答えて

4

この試してみてください:あなたは何を探してるんですか

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

に似lock -statementを使用することができます.NETで

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

MethodImplOptions.Synchronizedを使用するのは好きではないのは、これをロックする方法を教えてください。そして、 "これをロックする"というのは、デッドロックの可能性を増やすので、少しばかげていると考えられます。 –

+1

私は@MatthewWatsonに同意します。 MethodImplOptions.Synchronizedを避け、明示的なロックを使用する必要があります。 – Patrik

+0

質問はC#でこれを達成する方法でしたが、もっと好都合ではありませんでした。 –

6

は、ミューテックスやイベントです。 あなたがManualResetEvent -classを使用して

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

を経由してスレッドを待機させることができ、他のスレッドが最終的にそれが継続することができ、他のスレッドを知らせるために

mre.Set(); 

を呼び出します。

Look here

+0

'ManualResetEvent'を' Mutex'セマフォに置き換えることができますか? – Dimme

+1

はい、しかしそれらのうちの2つが必要です。 1つは各スレッドに通知するためのものです。このようにして、スレッド1がこれを通知するオブジェクトを生成し、第2のスレッドがオブジェクトが消費されたことを通知するとき。もちろん、多くのオブジェクトを作成したい場合は、別の方法を選択することもできます。状況によって異なります。しかし、イベントは非常に多くの状況に適しています。 [MSDN](http://msdn.microsoft.com/en-us/library/ms173179.aspx)のドキュメントを参照してください。 –