Параллельный вызов метода
От:
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: Параллельный вызов метода
Здравствуйте, KSergyN, Вы писали:
KSN>
KSN>http://localhost:8732/Design_Time_Addresses/Service/http/A
KSN>http://localhost:8732/Design_Time_Addresses/Service/http/A
KSN>http://localhost:8732/Design_Time_Addresses/Service/http/B
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>>http://localhost:8732/Design_Time_Addresses/Service/http/A
KSN>>http://localhost:8732/Design_Time_Addresses/Service/http/A
KSN>>http://localhost:8732/Design_Time_Addresses/Service/http/B
KSN>>
KSN>>первый и третий выполняются параллельно, а второй ждет окончания работы первого.
KSN>>Как полечить?
_>А Вам не кажется, что проблема в браузере?
_>С разных машин дергать метод A не пробовали?
Да, прикол (Chrome и IE обрабатывают параллельно). Пасиб!
Re[3]: Параллельный вызов метода
От:
Sharov
Дата: 20.08.12 11:39
Оценка:
Здравствуйте, KSergyN, Вы писали:
В Вашем коде я поставил Thread.Sleep(2000).
Запускал запросы Fiddler'ом, все отработали за 2 сек.
Кодом людям нужно помогать!
Re: Параллельный вызов метода
Здравствуйте, 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>http://localhost:8732/Design_Time_Addresses/Service/http/A
KSN>http://localhost:8732/Design_Time_Addresses/Service/http/A
KSN>http://localhost:8732/Design_Time_Addresses/Service/http/B
KSN>
KSN>первый и третий выполняются параллельно, а второй ждет окончания работы первого.
KSN>Как полечить?
Читать на тему многопоточность в WCF. Здесь, в рамках одной сессии, один и тот-же метод будут выполняться всегда последовательно, если не поставить нужные значения для ConcurrencyMode и UseSynchronizationContext.
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить