C#中的同步方法

本文关键字:同步方法 | 更新日期: 2023-09-27 18:00:29

将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#中实现类似的功能?

C#中的同步方法

在.NET中,您可以像在中一样使用lock-语句

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

您要查找的是互斥对象或事件。您可以使用ManualResetEvent-类并通过使线程等待

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

另一个线程最终调用

mre.Set();

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

看这里。

试试这个:

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