2013-02-15 2 views
0

У меня есть библиотека, которая подключается и работает с устройствами. Например:Возвращаемое значение TCL и исключение

public bool Connect(string ip) 
{ 
    try 
    { 
     // try connect to device 
    } 
    catch (Exception ex) 
    { 
     // trow custom exception 
    } 
} 

Это нормально, но теперь я решил включить в мою библиотеку TPL.

Проблема, с которой я столкнулся, - это логика возврата значений. Вместо передачи IP-адреса вы передадите список IP-адресов. Представьте, что вы хотите подключить до 10 устройств и 5 в порядке, а другие 5 неисправны I Изображение код как:

public Dictionary<Device, bool> Connect(List<Device> device) 
{ 
    try 
    { 
     // TPL try connect to device 
    } 
    catch (AggregatedException ex) 
    { 
     // trow custom exception 
    } 
} 

Если кто-то называет этот метод они только получить Exeption, в данном случае это может быть легко, но, например, если у меня есть другой метод, например Dictionary<Device, List<Logs>> GetLogs(List<Device> device) У меня было бы 5 устройств с данными и 5 устройств с ошибкой.

Каков наилучший способ возврата результата для правильных соединений и ошибок для неисправных? Соединение может завершиться по нескольким причинам.

UPDATE

Я попытался это:

public Dictionary<int, Task<string>> GetData3(int value) 
    { 
     Dictionary<int, Task<string>> dic = new Dictionary<int, Task<string>>(); 
     Task<string>[] tasks = new Task<string>[value]; 
     for (int i = 0; i < value; i++) 
     { 
      tasks[i] = Task.Factory.StartNew<string>((stateObject) => 
      { 
       var a = (int)stateObject; 
       return a + " Test"; 
      }, value); 
      dic.Add(i, tasks[i]); 
     } 
     Task.WaitAll(tasks); 

     return dic; 
    } 

И в клиенте WS:

 Service1Client sc = new Service1Client(); 
     var a = sc.GetData3(5); 

Если я перерыв в return dic я могу увидеть результаты:

Id = 1, Status = RanToCompletion, Method = "{null}", Result = "5 Test" 

Но в var a я вижу только:

Id = 1, Status = WaitingForActivation, Method = "{null}", Result = "{Not yet computed}" 

ответ

1

Вы могли бы возвращать Dictionary<Device, Task<Whatever>> (где Whatever будет результат для каждого устройства). Вы можете немедленно вернуть , начав подключение к каждому устройству. Тогда задача будет представлять (на основе каждого устройства), было ли соединение завершено, не удалось или все еще продолжается.

Помимо всего прочего, использование задач для асинхронных результатов в значительной степени является идиоматическим способом использования TPL ... и упрощается на C# 5 с помощью async/await.

Если вызывающий абонент хочет дождаться завершения всех задач и заполнить все исключения, они могут это сделать.

+0

Некоторые клиенты используют это как SDK, но у нас есть расширение, которое использует этот же SDK для создания WCF. Некоторые из людей, использующих WCF, используют php. Что бы вы подумали о создании: DeviceResult: Device и включить bool для ошибки и исключения? – Eisenrich

+0

@ Эйзенрих: Это похоже на то, что вы отрицаете половину преимущества использования TPL. Лично я считаю, что основанный на задачах подход является самым чистым и самым идиоматичным. –

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