WCF 从无死锁的回调调用服务属性



有人可以告诉我如何从回调中调用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);
            });

这是接收指令的回调实现

public void ReceiveInstruction(SAPUploadInstruction instruction)
        {
            // fire this objects call back....
            if (OnReceiveInstruction != null) OnReceiveInstruction(this, instruction);
        }

在上面,事件OnReceiveDirective附加到UI。处理方式如下:

 public void ReceiveInstruction(object sender, SAPUploadInstruction instruction)
        {
             DispatchIfNecessary(() => {
                 ProcessInstruction(instruction);
                        });
        }

上面的方法 - ProcessInstruction - 根据服务属性/功能设置各种控件。正是这一点陷入僵局,即Label1.Content = myService.SomeProperty。

顺便说一句,DispatchIfNeed实现为:

public void DispatchIfNecessary(Action action)
        {
            if (!Dispatcher.CheckAccess())
                Dispatcher.Invoke(action);
            else
                action.Invoke();
        }

DispatchIfNecessary中使用异步版本的Invoke,所以你的回调不会等待完成 UI 更改,这无法完成,因为 UI 线程正在等待回调处理结束(因此我们有死锁):

Dispatcher.BeginInvoke(action);

最新更新