2013-04-12 33 views
0

我有一个WCF服务,作为应用程序之间的中间件:WCF WCF接收来自多个客户端(比如系统A)的多个调用。每个呼叫都会导致对另一个系统的呼叫(比如系统B)。WCF单线程?同步通话?

是否有可能使系统B的呼叫每次都发生一次?而不是使呼叫虚拟化?

回答

3

如果系统B不关心它被调用的线程,但你只是想确保它不被多个线程同时调用(也许是因为你知道系统B依赖于全局变量或全局状态),你可以使用一个简单的互斥锁来使所有的线程排队并通过系统B的单个文件。类似这样的:

public class MyClass 
{ 
    private static object _lockObj = new Object(); 

    public void MyFunction() 
    { 
    lock(_lockObj) 
    { 
     system_B_call(etc); 
    } 
    } 
} 

重要提示:所有要“调节”的函数都必须使用相同的锁对象实例。

如果您的系统B对其被调用的线程敏感(包括WinForms和WCF的许多UI框架需要在主UI线程上发生UI更改),那么您需要将调用编组到特定线程。有几种方法可以做到这一点,其中之一是使用SynchronizationContext及其Post或Send方法。