Параллельный вызов метода
От: KSergyN  
Дата: 20.08.12 10:39
Оценка:
Запускаю веб сервис:
var host = new ServiceHost(typeof(Service), new Uri("http://localhost:8732/Design_Time_Addresses/Service/"));
host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "http://localhost:8732/Design_Time_Addresses/Service/http");
host.Description.Endpoints.Find(new Uri("http://localhost:8732/Design_Time_Addresses/Service/http")).Behaviors.Add(new WebHttpBehavior());
host.Open();
// ...

[ServiceContract]
public interface IService {
    [OperationContract, WebGet(UriTemplate = "A")]
    string A();
    [OperationContract, WebGet(UriTemplate = "B")]
    string B();
}
// ...

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false)]
public class Service : IService {
    public string A() {
        Console.WriteLine("Hello from A, " + Thread.CurrentThread.ManagedThreadId.ToString());
        Thread.Sleep(20000);
        return "";
    }

    public string B() {
        Console.WriteLine("Hello from B, " + Thread.CurrentThread.ManagedThreadId.ToString());
        Thread.Sleep(20000);
        return "";
    }
}


При параллельном вызове методов (из браузера)


первый и третий выполняются параллельно, а второй ждет окончания работы первого.

Как полечить?
Re: Параллельный вызов метода
От: Sharov Россия  
Дата: 20.08.12 11:04
Оценка:
Здравствуйте, KSergyN, Вы писали:

InstanceContextMode = PerCall ?
Кодом людям нужно помогать!
Re[2]: Параллельный вызов метода
От: KSergyN  
Дата: 20.08.12 11:16
Оценка:
S>InstanceContextMode = PerCall ?

Не помогает
Re: Параллельный вызов метода
От: scale_tone Норвегия https://scale-tone.github.io/
Дата: 20.08.12 11:25
Оценка:
Здравствуйте, KSergyN, Вы писали:


KSN>

KSN>первый и третий выполняются параллельно, а второй ждет окончания работы первого.


KSN>Как полечить?


А Вам не кажется, что проблема в браузере?
С разных машин дергать метод A не пробовали?
Re[3]: Параллельный вызов метода
От: Sharov Россия  
Дата: 20.08.12 11:26
Оценка:
Здравствуйте, KSergyN, Вы писали:

А с чего Вы решили, что второй ждет окончания первого?
Т.е. суммарное время работы вызовов = 40 сек?
Кодом людям нужно помогать!
Re[4]: Параллельный вызов метода
От: KSergyN  
Дата: 20.08.12 11:33
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, KSergyN, Вы писали:


S>А с чего Вы решили, что второй ждет окончания первого?

S>Т.е. суммарное время работы вызовов = 40 сек?

Да, 40. Плюс вывод в консоль. Плюс паузил процесс через пару секунд после запуска методов — есть по одному потоку, спящему в методах A и B (второго в A нет)
Re[2]: Параллельный вызов метода
От: KSergyN  
Дата: 20.08.12 11:36
Оценка:
Здравствуйте, scale_tone, Вы писали:

_>Здравствуйте, KSergyN, Вы писали:



KSN>>

KSN>>первый и третий выполняются параллельно, а второй ждет окончания работы первого.


KSN>>Как полечить?


_>А Вам не кажется, что проблема в браузере?

_>С разных машин дергать метод A не пробовали?

Да, прикол (Chrome и IE обрабатывают параллельно). Пасиб!
Re[3]: Параллельный вызов метода
От: Sharov Россия  
Дата: 20.08.12 11:39
Оценка:
Здравствуйте, KSergyN, Вы писали:

В Вашем коде я поставил Thread.Sleep(2000).
Запускал запросы Fiddler'ом, все отработали за 2 сек.
Кодом людям нужно помогать!
Re: Параллельный вызов метода
От: vvlad.net  
Дата: 20.08.12 11:46
Оценка:
Здравствуйте, KSergyN, Вы писали:

KSN>Запускаю веб сервис:

KSN>
KSN>var host = new ServiceHost(typeof(Service), new Uri("http://localhost:8732/Design_Time_Addresses/Service/"));
KSN>host.AddServiceEndpoint(typeof(IService), new WebHttpBinding(), "http://localhost:8732/Design_Time_Addresses/Service/http");
KSN>host.Description.Endpoints.Find(new Uri("http://localhost:8732/Design_Time_Addresses/Service/http")).Behaviors.Add(new WebHttpBehavior());
KSN>host.Open();
KSN>// ...

KSN>[ServiceContract]
KSN>public interface IService {
KSN>    [OperationContract, WebGet(UriTemplate = "A")]
KSN>    string A();
KSN>    [OperationContract, WebGet(UriTemplate = "B")]
KSN>    string B();
KSN>}
KSN>// ...

KSN>[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, InstanceContextMode = InstanceContextMode.PerSession, UseSynchronizationContext = false)]
KSN>public class Service : IService {
KSN>    public string A() {
KSN>        Console.WriteLine("Hello from A, " + Thread.CurrentThread.ManagedThreadId.ToString());
KSN>        Thread.Sleep(20000);
KSN>        return "";
KSN>    }

KSN>    public string B() {
KSN>        Console.WriteLine("Hello from B, " + Thread.CurrentThread.ManagedThreadId.ToString());
KSN>        Thread.Sleep(20000);
KSN>        return "";
KSN>    }
KSN>}
KSN>


KSN>При параллельном вызове методов (из браузера)


KSN>

KSN>первый и третий выполняются параллельно, а второй ждет окончания работы первого.


KSN>Как полечить?


Читать на тему многопоточность в WCF. Здесь, в рамках одной сессии, один и тот-же метод будут выполняться всегда последовательно, если не поставить нужные значения для ConcurrencyMode и UseSynchronizationContext.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.