2013-02-15 36 views
0

我开发了一个连接和操作设备的库。 例如:TPL返回值和例外

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

这是好的,但现在我决定在我的图书馆TPL包括。

我面临的问题是如何返回值的逻辑。 而不是传递一个IP,你会传递一个IP列表。 想象一下,你要连接10个设备和5都ok和其他5指责我像一个代码,如:

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中使用异步/等待更容易。

如果调用者想要等待所有任务完成并聚合任何异常,他们可以这样做。

+0

有些客户使用它作为SDK,但我们有一个扩展使用这个相同的SDK来创建一个WCF。一些使用WCF的人使用php。你认为创建什么:DeviceResult:Device并包含一个错误和异常的布尔值? – Eisenrich 2013-02-16 06:07:19

+0

@Eisenrich:感觉就是这样做,你完全否定使用TPL的一半好处。就我个人而言,我认为基于任务的方法是最干净和最习惯的方法。 – 2013-02-16 07:52:58