WCF InstanceContextMode.Single + ConcurrencyMode.Single上的奇怪行为

时间:2011-01-20 02:15:59

标签: .net multithreading wcf

我有这样的WCF服务:

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

MyWrokManger的StartWorker方法只是使用指向MyWorker的StartWork方法的start方法启动一个新线程。这是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 个答案:

答案 0 :(得分:1)

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