我有一个典型的生产者/消费者问题,正在尝试同步2个线程。我想在C#Compact Framework中找到一个Suspend()和Resume()的替代方案。他们都不是CF支持:(。我发现了一些例子,它们基于EventWaitHandle,并使用了类似于的东西
private EventWaitHandle ewh = new AutoResetEvent();
但问题是AutoResetEvent也不是Compact Framework的一部分。我想知道是否有其他方法可以使用EventWaitHandle解决此类生产者/消费者问题。我知道AutoResetEvent是从EventWaitHandle派生的。你还知道EventWaitHAndle的其他哪些子类?
正如您所发现的,没有自动重置事件。但您可以使用pinvoke来解决CreateEvent和WaitForSingleObject等问题。或者,如果您只是想同步对对象的访问,只需将Lock与"Lock"对象一起使用即可。使用的是伪代码:
螺纹1while(true){锁定(myLockObject){访问共享对象}线程.睡眠(1000)}
螺纹2while(true){锁定(myLockObject){访问共享对象}线程.睡眠(1100)}
每个线程将锁定同一个对象,并且一次只有一个线程可以访问共享对象。只有当锁对象没有被另一个代码行(此处为另一个线程)锁定时,锁内的代码才会运行。您可以简单地使用它来"挂起"并恢复线程。Lock对象旨在实现对共享变量的同步访问。
如前所述,OTOH只需pinvoke本地CreateEvent、WaitForSingleObject、SetEvent API函数。
我必须道歉,Compact Framework中确实存在AutoResetEvent。感谢Hans Passant建议使用Monitor类进行同步。