WCF線程安全性問(wèn)題有所解決
WCF開(kāi)發(fā)工具在開(kāi)發(fā)領(lǐng)域中占據(jù)著一個(gè)比較重要的地位。它的出現(xiàn)可以幫助開(kāi)發(fā)人員打造一款跨平臺(tái)的企業(yè)級(jí)解決方案。在這里我們將會(huì)通過(guò)對(duì)WCF線程的了解來(lái)更加深入的對(duì)這一工具有一個(gè)了解。#t#
雖然有許多人對(duì)WCF線程表示懷疑,但在年復(fù)一年的不斷發(fā)展中,他的安全性也在不斷提高。保障WCF線程正常運(yùn)行是完全有可能的,但前提是要深入理解到底什么是WCF線程,及他是怎么運(yùn)作的。
對(duì)于這些操作,任意創(chuàng)建一個(gè)新的線程來(lái)執(zhí)行都是等效的。但是有些情況下,有些操作卻只能在固定的線程下執(zhí)行。比如,在GUI應(yīng)用下,對(duì)控件的訪問(wèn)就需要在創(chuàng)建該控件的線程下執(zhí)行;
或者我們?cè)谀硞€(gè)固定的線程中通過(guò)TLS(Thread Local Storage)設(shè)置了一些Context信息,供具體的操作使用,我們把操作和某個(gè)固定的線程的依賴稱為線程關(guān)聯(lián)性(Thread Affinity)。
對(duì)應(yīng)WCF來(lái)說(shuō),無(wú)論是host一個(gè)service,還是在調(diào)用service時(shí)制定callback,在默認(rèn)的情況下,service和callback的操作將自動(dòng)和當(dāng)前的SynchonizationContext進(jìn)行關(guān)聯(lián)(如何有的話)。
也就是說(shuō),如過(guò)我們的service被host到Windows Form application下,那么service的操作將在UI 線程下執(zhí)行;同理,如何我們?cè)谝粋€(gè)Windows Forms UI線程下調(diào)用duplex service并制定callback,那么callback的最終執(zhí)行將在UI線程。
關(guān)于WCF線程關(guān)聯(lián)性的控制,可以通過(guò)ServiceBehavior或者CallbackBehavior的UseSynchronizationContext屬性進(jìn)行設(shè)定,該屬性默認(rèn)為true,這正式WCF默認(rèn)具有線程關(guān)聯(lián)性的原因。
現(xiàn)在我們來(lái)實(shí)現(xiàn)我們的第二套方案:讓Callback的執(zhí)行不必綁定到UI線程。為此我們只需要加上如何的CallbackBehavior attribute就可以了
- namespace Artech.ThreadAffinity.Clients
- {
- [CallbackBehavior(UseSynchronizationContext = false)]
- public class CalculateCallback : ICalculateCallback
- {
- public static TextBox ResultPanel;
- #region ICalculateCallback Members
- public void DisplayResult(double result)
- {
- ResultPanel.Text = result.ToString();
- }
- #endregion
- }
- }
以上就是對(duì)WCF線程的相關(guān)介紹。