【发布时间】:2013-11-12 17:03:06
【问题描述】:
谁能告诉我如何从回调中调用 WCF 服务的属性而不发生死锁?
我尝试将 [CallbackBehavior(ConcurrencyMode=ConcurrencyMode.Multiple)] 添加到实现回调的类中,但没有成功。
该服务具有以下属性:
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Single, InstanceContextMode = InstanceContextMode.Single)]
public class SAPUploadService : ISAPUploadService
{
谢谢MM
这是调用回调方法的代码
foreach (var otherConnection in _users.Keys)
{
SAPUploadInstruction ins = AddMessageToInstruction(message);
ins.UserName = user.UserName;
Task.Factory.StartNew(() =>
{
otherConnection.ReceiveInstruction(ins);
});
这是 ReceiveInstruction 的回调实现
public void ReceiveInstruction(SAPUploadInstruction instruction)
{
// fire this objects call back....
if (OnReceiveInstruction != null) OnReceiveInstruction(this, instruction);
}
在上面,事件 OnReceiveInstruction 附加到 UI。处理如下:
public void ReceiveInstruction(object sender, SAPUploadInstruction instruction)
{
DispatchIfNecessary(() => {
ProcessInstruction(instruction);
});
}
上面的方法——ProcessInstruction——根据服务属性/功能设置各种控件。正是这个陷入僵局,即 Label1.Content = myService.SomeProperty。
顺便说一句,DispatchIfNecessary 实现为:
public void DispatchIfNecessary(Action action)
{
if (!Dispatcher.CheckAccess())
Dispatcher.Invoke(action);
else
action.Invoke();
}
【问题讨论】:
-
请提供更多关于您想要访问 WCF 服务属性的回调方法的详细信息。
-
首先想到,你有没有尝试设置
ConcurrencyMode.Reentrant? -
是的,我已经尝试过 Reentrant 选项,不满意。
-
所以你的情况从一开始就比较复杂。尝试将
CallbackBehavior(UseSynchronizationContext = false)添加到实现回调的类中。 -
我试过了.. [CallbackBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant, UseSynchronizationContext = false)] AND ....[CallbackBehavior(UseSynchronizationContext = false)] AND ..[CallbackBehavior(ConcurrencyMode = ConcurrencyMode .Multiple)] 但没有运气。