我有一个方法称为HandleMessage
,一个新的线程开始处理消息。如果锁对象获取成功,然后处理它。否则,将消息放入队列中。 A SynchronizationLockException
总是在Monitor.Exit(o)
处抛出,因为在await
之后,上下文不再处于原始线程中。什么是正确的实施方式?SynchronizationLockException等待后
public void HandleMessage(string message)
{
Task.Factory.StartNew(async delegate
{
if (Monitor.TryEnter(o))
{
try
{
do
{
await HandleMessageAsync(message);
}
while (queue.TryDequeue(out message));
}
finally
{
Monitor.Exit(o);
}
}
else
{
queue.Enqueue(message);
}
});
}
副手,似乎TPL数据流将会更适合,因为您的HandleMessage可以只发布到块而不是包含此逻辑? –