【问题标题】:WCF Calling a service property from a callback without deadlockWCF从没有死锁的回调中调用服务属性
【发布时间】: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)] 但没有运气。

标签: c# wcf callback deadlock


【解决方案1】:

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

Dispatcher.BeginInvoke(action);

【讨论】:

    猜你喜欢
    • 2013-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    • 1970-01-01
    • 2020-11-28
    • 1970-01-01
    相关资源
    最近更新 更多