【发布时间】:2012-07-20 16:08:38
【问题描述】:
问题: 在 WCF 客户端中收到死锁异常消息。
场景:
服务调用客户端回调(此调用完全独立,由服务器上的某些条件发起)。
在客户端回调函数内部,客户端调用服务中的一个函数,此时会抛出死锁异常:
此操作会死锁,因为在当前消息完成处理之前无法收到回复。如果要允许乱序消息处理,请在 CallbackBehaviorAttribute 上指定 ConcurrencyMode 为 Reentrant 或 Multiple。
我尽量简化代码。我确实阅读了这篇文章,但我仍然找不到问题所在:http://msdn.microsoft.com/en-us/library/cc294424.aspx 我会很感激任何建议....
服务:
[ServiceContract(Namespace = "http://abc.com/Core", SessionMode = SessionMode.Required, CallbackContract = typeof(ISvcCallback))]
public interface ISvc
{
// One way only - does not wait until operation completes and returns
// Can initiate session
[OperationContract(IsOneWay = true)]
void Initialize(string appId);
[OperationContract(IsInitiating = false)]
Account GetCurrentAccount();
}
public interface ISvcCallback
{
/// <summary>
/// Report status of the account
/// </summary>
/// <param name="acct"></param>
[OperationContract(IsOneWay=true)]
void AccountStatus(Account acct);
}
Service Implementation
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)]
public class Svc : ISvc
{
public Account GetCurrentAccount()
{
SipAccount sipAcct = null;
try
{
Account acct = m_MyBusinessObject.GetCurrentAccount();
}
catch (Exception ex)
{
}
return Acct;
}
}
}
客户:
public class CallbackHandler : WcfSipItfService.IWinSipItfCallback
{
public void AccountStatus(Account Acct)
{
try
{
// display accout status in UI by delegate-wrapped event
// delegate and event declarations are somewhere else
// and work fine...
if (DisplayAccountStatusEvent != null)
DisplayAccountStatusEvent(Acct);
}
catch (Exception ex)
{
....
}
}
private void OnDisplayAccountStatusEvent(Account acct)
{
// call service function results in deadlock
Account acct = GetCurrentAccount();
}
}
服务是双工的 - 使用 WSDualHttpBinding。
【问题讨论】:
标签: wcf concurrency