Странное поведение в WCF InstanceContextMode.Single + ConcurrencyMode.Single - PullRequest
1 голос
/ 20 января 2011

У меня есть служба WCF, подобная этой:

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

Метод StartWorker MyWrokManger просто запускает новый поток с методом start, указанным для метода StartWork MyWorker's.Вот класс 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.

Как может закончиться 2-й вызов до 1-го?Я думал, что каждый вызов метода должен быть последовательным.Чего мне не хватает?

1 Ответ

1 голос
/ 20 января 2011

Присоединяешься ли ты к созданной теме в методе Start?Если нет, он просто запускает рабочий и завершается, чтобы другой запрос мог быть обработан во время работы вашего рабочего потока.InstnaceContextMode и ConcurrencyMode влияют только на служебный поток, а не на потоки, запущенные из операций вашей службы.Поэтому, если ваша операция не ожидает завершения работника, вы можете вызвать операцию несколько раз, прежде чем первый работник завершит свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...