我开发了一个连接和操作设备的库。 例如: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}"
有些客户使用它作为SDK,但我们有一个扩展使用这个相同的SDK来创建一个WCF。一些使用WCF的人使用php。你认为创建什么:DeviceResult:Device并包含一个错误和异常的布尔值? – Eisenrich 2013-02-16 06:07:19
@Eisenrich:感觉就是这样做,你完全否定使用TPL的一半好处。就我个人而言,我认为基于任务的方法是最干净和最习惯的方法。 – 2013-02-16 07:52:58