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