DirectSoundWrapper を作成しましたが、MTA スレッドを介してインターフェイスにアクセスできます。そこで、バックグラウンドで動作し、キューでアクションを実行するスレッドを作成しました。私はこのようなことをしました:
private void MTAQueue()
{
lock (queueLockObj)
{
do
{
if (marshalThreadItems.Count > 0)
{
MarshalThreadItem item;
item = marshalThreadItems.Dequeue();
item.Action();
}
else
{
Monitor.Wait(queueLockObj);
}
} while (!disposing);
}
}
そして、私は次のようなアクションを実行します:
private void ExecuteMTAAction(Action action)
{
if (IsMTAThread)
action();
else
{
lock (queueLockObj)
{
MarshalThreadItem item = new MarshalThreadItem();
item.Action = action;
marshalThreadItems.Enqueue(item);
Monitor.Pulse(queueLockObj);
}
}
}
しかし今、私はアクションが呼び出されるのを待ちたいと思いました。だから私は ManuelResetEvent を使いたかった:
private void ExecuteMTAAction(Action action)
{
if (IsMTAThread)
action();
else
{
lock (queueLockObj)
{
MarshalThreadItem item = new MarshalThreadItem();
item.Action = action;
item.waitHandle = new ManualResetEvent(false); //setup
marshalThreadItems.Enqueue(item);
Monitor.Pulse(queueLockObj); //here the pulse does not pulse my backgrond thread anymore
item.waitHandle.WaitOne(); //waiting
}
}
}
そして、私のバックグラウンドスレッドは次のように編集します:
item.Action();
item.waitHandle.Set();
問題は、バックグラウンド スレッドがもうパルス化されず、待機し続け (Monitor.Wait(queueLockObj))、アクションを呼び出すメインスレッドが manuelresetevent を待機することです...?
なんで?