0

典型的なプロデューサー/コンシューマーの問題があり、2 つのスレッドを同期しようとしています。C# Compact Framework で Suspend() と Resume() に代わるものを見つけたいです。どちらも CF :( でサポートされていません。 EventWaitHandle に基づいており、次のようなものを使用する例をいくつか見つけました。

      private EventWaitHandle ewh = new AutoResetEvent();

しかし問題は、AutoResetEvent も Compact Framework の一部ではないことです。このような Producer/Consumer の問題を 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) }

各スレッドは同じオブジェクトをロックし、一度に 1 つのスレッドだけが共有オブジェクトにアクセスできます。ロック内のコードは、ロック オブジェクトが別のコード行 (ここでは別のスレッド) によってロックされていない場合にのみ実行されます。これを単に「サスペンド」してスレッドを再開するために使用できます。Lock オブジェクトは、共有変数への同期アクセスを可能にするように設計されています。

OTOH は、既に述べたように、ネイティブの CreateEvent、WaitForSingleObject、SetEvent API 関数をピンボークするだけです。

于 2014-11-07T18:17:48.927 に答える
0

申し訳ありませんが、Compact Framework には確かに AutoResetEvent があります。同期に Monitor クラスを使用することを提案した Hans Passant に感謝します。

于 2014-11-20T15:38:50.857 に答える