2013-02-15 2 views
0

장치를 연결하고 작동하는 라이브러리를 개발했습니다. 예를 들어 :TPL 반환 값 및 예외

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

이 좋아,하지만 지금은 내 라이브러리 TPL에 포함하기로 결정했습니다.

내가 직면 한 문제는 값을 반환하는 논리에 있습니다. IP를 전달하는 대신 IP 목록을 전달합니다. 10 개 개의 장치에 연결할 상상해 5 확인하고 다른 5 내가 이미지를 폴트하는 코드처럼 : 누군가가이 메소드를 호출하면 그들은 단지 exeption를받을

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

,이 경우에는 될 수 있습니다 쉽지만 예를 들어, Dictionary<Device, List<Logs>> GetLogs(List<Device> device)과 같은 다른 방법이 있다면 데이터가있는 5 개의 장치와 5 개의 장치가 오류를 일으 킵니다.

올바른 연결과 오류가 발생한 연결에 대한 결과를 반환하는 가장 좋은 방법은 무엇입니까? 연결은 여러 가지 이유로 실패 할 수 있습니다. 내가 시도

UPDATE이 :

Id = 1, Status = RanToCompletion, Method = "{null}", Result = "5 Test" 
: 내가 return dic에 침입 경우

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

내가 결과를 볼 수 있습니다

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 클라이언트에서

그러나 var a에 난 단지 참조 :

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

답변

1

당신은 반환 할 수있는 Dictionary<Device, Task<Whatever>> (Whatever 각 장치에 대한 결과가 될 것입니다 경우). 각 장치에 연결을 시작한 즉시 으로 반환 할 수 있습니다. 그런 다음 작업은 연결이 완료되었는지, 실패했는지, 계속 진행 중인지 여부 (장치별로)를 나타냅니다.

비동기 결과에 대한 작업을 사용하는 것은 TPL을 사용하는 관용적 인 방법이며 async/await로 C# 5에서 더 쉽게 만들 수 있습니다.

호출자가 모든 작업이 완료 될 때까지 기다렸다가 예외를 집계하려면 그렇게 할 수 있습니다.

+0

일부 고객은 이것을 SDK로 사용하지만이 SDK를 사용하여 WCF를 만드는 확장 프로그램이 있습니다. WCF를 사용하는 사람들 중 일부는 PHP를 사용합니다. DeviceResult : Device를 작성하고 오류 및 예외에 대한 bool을 포함하는 것을 어떻게 생각하십니까? – Eisenrich

+0

@Eisenrich : 그렇게함으로써 TPL을 사용하면 이익의 절반을 무효화 할 수 있습니다. 개인적으로 저는 작업 기반 접근법이 가장 깨끗하고 가장 관용적이라고 생각합니다. –