我有一個方法稱爲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可以只發布到塊而不是包含此邏輯? –