即使回调IsOneWay,WCF客户端也会因回调而死锁

栏目: ASP.NET · 发布时间: 5年前

内容简介:好吧,我想我已经怀疑了.WCF服务默认为单线程.所有调用和回调都被编组到一个线程(或者SynchronizationContext更准确).我的应用程序是单线程WPF应用程序,因此SynchronizationContext被设置为分派线程.

WCF新手.

我有一个客户端在调用WCF服务时死锁.

该服务将在呼叫时调用对客户端的回叫,标记为IsOneWay.我已经确认该服务没有阻止回调.

然后,客户端立即再次调用相同的服务(紧密循环),而尚未为回调提供服务.然后客户端死锁(并且服务端的断点永远不会被触发).

所以回顾一下:

CLIENT                                SERVICE
Call service -----------------------> (service breakpoint triggers)
(waiting for dispatch thread) <------ Invoke callback (IsOneWay - doesn't block)
                                      Service returns

Call service again immediately -----? (service breakpoint doesn't trigger)
(deadlock)

我假设回调已经在客户端抓取了一些WCF锁定,然后来自客户端的第二个服务调用也想要该锁定,因此导致死锁.但这只是假设.

我已经阅读了有关ConcurrencyMode但我无法决定使用哪种模式,或者在哪里放置它因为我不是100%清楚发生了什么,以及什么被严格阻止.

如果可能的话,我还希望保持所有回调由分派线程服务,因为它使代码更简单.

任何WCF专家都可以详细了解这里发生的事情吗?

非常感谢

好吧,我想我已经怀疑了.

WCF服务默认为单线程.所有调用和回调都被编组到一个线程(或者SynchronizationContext更准确).

我的应用程序是单线程WPF应用程序,因此SynchronizationContext被设置为分派线程.

当回调进来时,它试图封送对调度线程的调用,这当然是对原始服务调用的阻塞.我不清楚它是否完全锁定,但显然它会在等待调度线程之前尝试获取一些全局锁定.

当调度线程再次调用该服务时,它会在此全局锁定上死锁.

两种方式:

1)首先在不同的线程上创建服务代理.所有调用都将通过此线程进行编组,而调度线程被阻塞也无关紧要.

2)将[CallbackBehavior(UseSynchronizationContext = false)]属性应用于实现回调的客户端类.这意味着当回调进入时,WCF将忽略同步上下文,并且它将在任何可用线程上为其提供服务.

我去了2.显然这意味着我需要编组可以自动将GUI更新到调度线程的回调,但幸运的是我的回调实现无论如何都是一个小包装器,所以我只是在每个回调方法中执行_dispatcher.BeginInvoke()异步的元帅.然后,调度线程将在获得我想要的机会时进行服务.

翻译自:https://stackoverflow.com/questions/6276950/wcf-client-deadlocking-due-to-callback-even-when-callback-isoneway


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

程序员的数学2

程序员的数学2

平冈和幸、堀玄 / 陈筱烟 / 人民邮电出版社 / 2015-8-1 / CNY 79.00

本书沿袭《程序员的数学》平易近人的风格,用通俗的语言和具体的图表深入讲解程序员必须掌握的各类概率统计知识,例证丰富,讲解明晰,且提供了大量扩展内容,引导读者进一步深入学习。 本书涉及随机变量、贝叶斯公式、离散值和连续值的概率分布、协方差矩阵、多元正态分布、估计与检验理论、伪随机数以及概率论的各类应用,适合程序设计人员与数学爱好者阅读,也可作为高中或大学非数学专业学生的概率论入门读物。一起来看看 《程序员的数学2》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具