在我的 Parallel.Foreach 循环中,我正在调用
_helper.subscribeUserEndPoint(loop._contactGrpSvcs);
_helper 是 UserEndPoint 和所有其他操作(如订阅)的封装类
订阅方法是:
public void subscribeUserEndPoint(ContactGroupServices cntGrpSvcs)
{
cntGrpSvcs.BeginSubscribe(TerminateSubscribe, cntGrpSvcs);
_contactSubscribeCompleted.WaitOne();
LOG.Info("Returning from Successful Subscribe Endpoint");
}
private void TerminateSubscribe(IAsyncResult result)
{
ContactGroupServices cntGrpSvcs = result.AsyncState as ContactGroupServices;
try
{
cntGrpSvcs.EndSubscribe(result);
}
catch (Exception ex)
{
LOG.Error("Failed to Complete Subscribe. " + ex.StackTrace);
}
CollaborationSubscriptionState state = cntGrpSvcs.CurrentState;
LOG.Info("Subscribed State = " + state.ToString());
_contactSubscribeCompleted.Set();
}
等待_contactSubscribeCompleted.WaitOne()时的线程死锁;有什么方法可以避免这种死锁争用?
干杯,
-- Brian
PS:可能发生死锁的一个原因是 AutoResetEvent 的固有问题——从文档中——“不能保证每次调用 Set 方法都会释放一个线程。如果两个调用靠得太近,这样第二次调用在线程被释放之前发生,只有一个线程被释放。就好像第二次调用没有发生一样。另外,如果在没有线程等待并且已经发出 AutoResetEvent 信号时调用 Set,则通话无效。” 有解决方法吗?