2011-01-20 31 views
1

奇怪的行为我有一个WCF服务是这样的:对WCF InstanceContextMode.Single + ConcurrencyMode.Single

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single, ConcurrencyMode = ConcurrencyMode.Single)] 
public class MyWcfService 
{ 
    public void StartIt() 
    { 
     MyWorkManager mgr = new MyWorkManager(new MyWorker()); 
     mgr.StartWorker(); 
    } 
} 

MyWrokManger的StartWorker方法只是开始用start方法一个新的线程指出MyWorker的StartWork方法。这里的MyWorker类:​​

public class MyWorker 
{ 
    public void StartWork() 
    { 
     Mylogger.Log("Starting work..."); 

     // Call a long running method 
     LongRunningMethod(); 

     Mylogger.Log("Completed work."); 
    } 

    private void WorkerMethod() 
    { 
     Mylogger.Log("Starting WorkerMethod()..."); 

     // do something here 

     Mylogger.Log("Completed WorkerMethod()."); 
    } 
} 

然后我用我的客户来调用服务两次在一个循环中,在这里就是我在日志中看到(按时间戳排序):

Invocation  ThreadID  Message 
================================================= 
1    5   Starting work... 
2    7   Starting work... 
2    7   Starting WorkerMethod()... 
1    5   Starting WorkerMethod()... 
2    7   Completed WorkerMethod(). 
1    5   Completed WorkerMethod(). 
2    7   Completed work. 
1    5   Completed work. 

哪有第二在第一次之前完成调用?我认为每个方法调用都是顺序的。我错过了什么?

回答

1

你是否在Start方法中加入创建的线程?如果没有,它只是启动worker并完成,所以其他请求可以在您的工作线程运行时进行处理。 InstnaceContextModeConcurrencyMode仅影响服务线程,不影响从服务操作启动的线程。因此,如果您的操作不等待工人完成,您可以在第一名工人完成工作前多次调用操作。

+0

是的,我认为这是问题所在。 WCF InstanceContext和Concurrency模式只控制服务线程,但我的工作管理器产生了我需要管理自己的工作线程。 – notlkk 2011-01-21 00:42:18