2013-09-21 3 views
1

Я должен послать List моего пользовательского объекта («Dial») клиенту из моего WCF service.This объекта имеет 5 свойства: Id, Name, Type, Individual_avg, Dept_avg , Значения Id, имя и тип приходят из таблицы, но Individual_avg и dept_avg приходят из требования 3-й участник service.The является:Установка времени ожидания на петле Parallel.ForEach

  1. нагрузки статические свойства - Id, Name, Type из таблицы
  2. Вызвать метод в службе 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) задавать. Какие изменения следует внести, чтобы эта часть кода работала по назначению?

ответ

1

ReadConfig выполняет изменения локально и, следовательно, indiDials не обновляется. Вы можете преобразовать его в функцию, чтобы вернуть измененный элемент. Пример кода:

private DialDetails ReadConfig(string userName,ref DialDetails dialObj) 
{ 
    //call the 3rd party service 
    dialObj.Individual_avg = serviceResponse.someValue; 
    dialObj.dept_avg = serviceResponse.anotherValue; 

    retun dialObj; 
} 

И вызвать его из петли таким образом, что List модифицируется:

indiDials[indiDials.IndexOf(newDial)] = ReadConfig(userName, ref newDial); 
+0

Спасибо! Это работает. Однако проблема заключается в том, что после достижения Тайм-аута в 30 секунд он не возвращает никакого объекта ». Если службе требуется более 30 секунд для ответа, я должен отправить объекты только с тремя свойствами, полученными из таблицы (Id, Name, Type) и установите для остальных 2 свойства значение null. " В настоящее время он отправляет пустой «Список», хотя идентификаторы, имя и тип были установлены на наборах. – user1550951

+0

@ user1550951 вы установили свой тайм-аут в цикле и, таким образом, он будет применяться на следующей итерации (в случае, если соединение занимает слишком много времени). Вы должны установить тайм-аут также в самом соединении (serviceResponse). – varocarbas

+0

@ user1550951 Я не знаю, какое соединение вы используете. Но если вы не «запустите время», он будет пытаться столько, сколько потребуется, и остальная часть кода (включая ваш собственный бит времени ожидания) будет ждать. Вы должны сделать некоторые исследования/спросить (новый вопрос) о том, как справиться с этим при настройке соединения. Свойство timeout является частью базовой конфигурации любого типа соединения (и, следовательно, должно быть довольно просто найти это). – varocarbas

Смежные вопросы