虽然有许多人对WCF线程表示怀疑,但在年复一年的不断发展中,他的安全性也在不断提高。保障WCF线程正常运行是完全有可能的,但前提是要深入理解到底什么是WCF线程,及他是怎么运作的。
对于这些操作,任意创建一个新的线程来执行都是等效的。但是有些情况下,有些操作却只能在固定的线程下执行。比如,在GUI应用下,对控件的访问就需要在创建该控件的线程下执行;
或者我们在某个固定的线程中通过TLS(Thread Local Storage)设置了一些Context信息,供具体的操作使用,我们把操作和某个固定的线程的依赖称为线程关联性(Thread Affinity)。 #t#
对应WCF来说,无论是host一个service,还是在调用service时制定callback,在默认的情况下,service和callback的操作将自动和当前的SynchonizationContext进行关联(如何有的话)。
也就是说,如过我们的service被host到Windows Form application下,那么service的操作将在UI 线程下执行;同理,如何我们在一个Windows Forms UI线程下调用duplex service并制定callback,那么callback的最终执行将在UI线程。
关于WCF线程关联性的控制,可以通过ServiceBehavior或者CallbackBehavior的UseSynchronizationContext属性进行设定,该属性默认为true,这正式WCF默认具有线程关联性的原因。
现在我们来实现我们的第二套方案:让Callback的执行不必绑定到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
- }
- }