Я должен послать List
моего пользовательского объекта («Dial») клиенту из моего WCF service.This объекта имеет 5 свойства: Id, Name, Type, Individual_avg, Dept_avg , Значения Id, имя и тип приходят из таблицы, но Individual_avg и dept_avg приходят из требования 3-й участник service.The является:Установка времени ожидания на петле Parallel.ForEach
- нагрузки статические свойства - Id, Name, Type из таблицы
- Вызвать метод в службе WCF, который получает другие значения свойств 2 от сторонней службы.
Мне нужно тайм-аут вызова сторонней службе через 30 секунд. То есть, если службе требуется более 30 секунд для ответа, я должен отправить объекты только с тремя свойствами, полученными из таблицы (Id, Name, Type), а остальные 2 свойства равны null. Например, в List
есть 5 Dials
. Создайте 5 потоков, чтобы вызвать стороннее обслуживание, чтобы получить 2 свойства. Если тайм-аут возникает после получения значений для 2 Dials
, отправьте List
со всеми свойствами, установленными для этих 2 Dials
, и только Id, Name и Type для других 3 Циферблаты. Для этого у меня есть следующий код.
public DialResponse GetDials(DialRequest req)
{
DialResponse response = new DialResponse();
var indiDials = new List<DialDetails>();
foreach (var c in indiDialIdToShow)
{
var indiObj = _repository.FindQueryable<DashboardDial_Tbl>().Where(p => p.DialId == c.DialIdToShow && p.IsActive == true).Select(p => new DialDetails()
{
Id = p.DialId,
Name = p.DialName,
Type = p.DialType,
}).SingleOrDefault();
indiDials.Add(indiObj);
}
var timeout = 30000; // 30 seconds
var cts = new CancellationTokenSource();
var token = new CancellationToken();
token = cts.Token;
var myOptions = new ParallelOptions { CancellationToken = cts.Token };
using (var t = new Timer(_ => cts.Cancel(), null, timeout, -1))
{
Parallel.ForEach(indiDials, myOptions, c =>
{
DialDetails newDial = c;
ReadConfig(c.Id, userName, ref newDial);
//send a reference to the "dial" object and set the 2 properties on the object
});
}
response.DialsList = indiDials;
}
private void ReadConfig(string userName,ref DialDetails dialObj)
{
//call the 3rd party service
dialObj.Individual_avg = serviceResponse.someValue;
dialObj.dept_avg = serviceResponse.anotherValue;
}
Для проверки «тайм-аут» функциональность, я положил Thread.Sleep(40000)
в "ReadConfig"
method.This возвращает пустой список «циферблатов» вместо отправки «циферблатов» только с 3 свойствами (Id, Name, Type) задавать. Какие изменения следует внести, чтобы эта часть кода работала по назначению?
Спасибо! Это работает. Однако проблема заключается в том, что после достижения Тайм-аута в 30 секунд он не возвращает никакого объекта ». Если службе требуется более 30 секунд для ответа, я должен отправить объекты только с тремя свойствами, полученными из таблицы (Id, Name, Type) и установите для остальных 2 свойства значение null. " В настоящее время он отправляет пустой «Список», хотя идентификаторы, имя и тип были установлены на наборах. – user1550951
@ user1550951 вы установили свой тайм-аут в цикле и, таким образом, он будет применяться на следующей итерации (в случае, если соединение занимает слишком много времени). Вы должны установить тайм-аут также в самом соединении (serviceResponse). – varocarbas
@ user1550951 Я не знаю, какое соединение вы используете. Но если вы не «запустите время», он будет пытаться столько, сколько потребуется, и остальная часть кода (включая ваш собственный бит времени ожидания) будет ждать. Вы должны сделать некоторые исследования/спросить (новый вопрос) о том, как справиться с этим при настройке соединения. Свойство timeout является частью базовой конфигурации любого типа соединения (и, следовательно, должно быть довольно просто найти это). – varocarbas