WCF Service Hosting的線程關聯性Mono實現比.NET統一?


Mono 3.0.2 基於雙工通信的WCF應用 Demo 的討論中 深藍醫生 提到了一個問題:

樓主,找了幾天,終於明白我的程序錯誤在哪里了,在服務契約上加入下面的接口方法:
[OperationContract]
double Sub(double x, double y);
這樣客戶端調用的時候,能夠直接得到Sub方法的返回值,但同樣功能的服務在mono 上面運行的時候,出現下面的錯誤:
Unhandled Exception:
System.NullReferenceException: Object reference not set to an instance of an object
at System.ServiceModel.Description.CallbackDebugBehavior.System.ServiceModel.Description.IEndpointBehavior.ApplyClientBehavior (System.ServiceModel.Description.ServiceEndpoint endpoint, System.ServiceModel.Dispatcher.ClientRuntime behavior) [0x00000] in <filename unknown>:0
at System.ServiceModel.Description.ServiceEndpoint.CreateClientRuntime (System.Object callbackDispatchRuntime) [0x00000] in <filename unknown>:0
---------------
所以,問題出在mono的WCF雙工服務中,方法不支持
IsOneWay = false 的情況,也就是服務的雙向調用。
============
向樓主求解,萬分感謝!

這樣的方法在Windows 下運行良好,把它放到了Mono環境下不正常了。有時候需要“同步”的回調,這也是合理的需求呀,我把他這個方法進去進行測試:

image

然后在服務的實現上加上ServiceBehavir的UseSynchronizationContext 進行設定。UseSynchronizationContext 的默認值為true。

image

WCF的service操作默認實現了對Host service的當前線程的SynchonizationContext實現了關聯。與Callback操作的線程關聯性通過CallbackBehavior的UseSynchronizationContext 進行控制,我們將CalculateService的UseSynchronizationContext 設為false。

客戶端的調用代碼:

image

然后放到Mono上去運行,成功了。

image

在Windows From的UI線程下使用的時候是需要明確指定UseSynchronizationContext 為false的,在控制台下是不需要的。在Mono的運行環境都需要明確的指定UseSynchronizationContext 為false。這是否可以說明Mono的實現更加統一呢?

代碼下載

相關文章:

WCF 中的同步環境

WCF后續之旅(11): 關於並發、回調的線程關聯性(Thread Affinity)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM