7

将 Java 应用程序移植到 C# 的一部分是在 C# 中实现同步消息缓冲区。通过同步,我的意思是线程在其中写入和读取消息应该是安全的。

在 Java 中,这可以使用synchronized方法 和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# 中实现类似的功能?

4

2 回答 2

7

在 .NET 中,您可以使用lock- 语句,如

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

您正在寻找的是互斥锁或事件。您可以使用ManualResetEvent-class 并使线程等待通过

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

另一个线程最终调用

mre.Set();

向另一个线程发出它可以继续的信号。

这里

于 2013-02-22T15:33:49.717 回答
3

试试这个:

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
    }
}
于 2013-02-22T15:32:53.833 回答