Страницы

Поиск по вопросам

понедельник, 16 декабря 2019 г.

Asynchronous Operation in WCF

#c_sharp #wcf


Мне нужно выполнить background операцию, которая занимает много времени в моем WCF-сервисе.
Сервис не должен быть заблокирован во время выполнения этой операции. Вызов операции
происходит из контроллера.
Server Side:

[ServiceContract]
public interface IServiceContract
{
    [OperationContract]
    System.Threading.Tasks.Task GetMessages(int sleep);
}

public class HelloService : IServiceContract
{
    public async System.Threading.Tasks.Task GetMessages(int sleep)
    {
        var task = System.Threading.Tasks.Task.Factory.StartNew(() =>
        {
            Thread.Sleep(sleep);
            return "Return from Server after: " + sleep;
        });
        return await task.ConfigureAwait(false);
    }
}


Client side:

public partial class HelloServiceClient : ClientBase,
                                          IServiceContract {
   public System.Threading.Tasks.Task GetMessages(int sleep)
   {
       return Channel.GetMessages(sleep);
   }


Использование в контроллере:

    public async System.Threading.Tasks.Task GetResult(int sleep)
    {
       var client = DAACommunicationServiceHelper.CreateClient();
       SystemLogManager.Current.Write("Start GetResult: " + sleep);
       var result = await client.GetMessages(sleep);
       SystemLogManager.Current.Write("GetResult = " + result);
       SystemLogManager.Current.Write("End GetResult: " + sleep);
       return result;
    }


После этого я отправила 2 запроса:

POST https://localhost:44374/Services/Maintenance.asmx/GetResult HTTP/1.1
{"sleep":1000}


и сразу

POST https://localhost:44374/Services/Maintenance.asmx/GetResult HTTP/1.1
{"sleep":1}


Я ожидала что запрос "sleep":1 выполниться быстрее, но WCF-сервис был заблокирован
пока не выполнился запрос "sleep":10000.

Вот что в логах:

2017-06-14 11:25:16.1684 INFO Start GetResult: 10000
2017-06-14 11:25:19.3156 INFO Start GetResult: 1
2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 10000
2017-06-14 11:25:26.1802 INFO End GetResult: 10000
2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 1
2017-06-14 11:25:26.1802 INFO End GetResult: 1


UPD:
Почему WCF-сервис был заблокирован пока не выполнился запрос "sleep":10000? Мне нужно
чтобы WCF-сервис выполнял операцию асинхронно и запросы возвращались по мере выполнения. 
В логах я рассчитывала увидеть такое:

2017-06-14 11:25:16.1684 INFO Start GetResult: 10000
2017-06-14 11:25:19.3156 INFO Start GetResult: 1
2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 1
2017-06-14 11:25:26.1802 INFO End GetResult: 1
2017-06-14 11:25:26.1802 INFO GetResult = Return from Server after: 10000
2017-06-14 11:25:26.1802 INFO End GetResult: 10000

    


Ответы

Ответ 1



Проверила на чистом проекте и заметила что на реальном проекте для сервиса было указано [ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]. Проблема решилась добавлением ConcurrencyMode.Multiple

Комментариев нет:

Отправить комментарий