0

我有一个典型的生产者/消费者问题并尝试同步 2 个线程。我想在 C# Compact Framework 中找到 Suspend() 和 Resume() 的替代方法。它们都不受 CF 支持:(。我找到了一些示例,这些示例基于 EventWaitHandle 并使用类似:

      private EventWaitHandle ewh = new AutoResetEvent();

但问题是 AutoResetEvent 也不是 Compact Framework 的一部分。我想知道是否有另一种方法可以使用 EventWaitHandle 解决此类生产者/消费者问题。我知道 AutoResetEvent 是从 EventWaitHandle 派生的。你还知道 EventWaitHAndle 的哪些其他子类?

4

2 回答 2

1

如您所见,没有自动重置事件。但是您可以使用 pinvoke 来解决 CreateEvent 和 WaitForSingleObject 等问题。或者,如果您只想同步对对象的访问,只需将 Lock 与“Lock”对象一起使用。使用在伪代码中:

thread1 while(true){ Lock(myLockObject){ 访问共享对象 } Thread.Sleep(1000) }

thread2 while(true){ Lock(myLockObject){ 访问共享对象 } Thread.Sleep(1100) }

每个线程将锁定同一个对象,并且一次只有一个线程可以访问共享对象。只有当锁对象没有被另一个代码行(这里是另一个线程)锁定时,锁内的代码才会运行。您可以简单地使用它来“暂停”并恢复线程。Lock 对象旨在启用对共享变量的同步访问。

OTOH,如前所述,只需调用本机 CreateEvent、WaitForSingleObject、SetEvent API 函数。

于 2014-11-07T18:17:48.927 回答
0

我必须道歉,Compact Framework 中确实有 AutoResetEvent。感谢 Hans Passant 建议使用 Monitor 类进行同步。

于 2014-11-20T15:38:50.857 回答