TPL返回值和异常
本文关键字:异常 返回值 TPL | 更新日期: 2023-09-27 17:59:41
我开发了一个连接设备并与设备操作的库。例如:
public bool Connect(string ip)
{
try
{
// try connect to device
}
catch (Exception ex)
{
// trow custom exception
}
}
这是可以的,但现在我决定把TPL包括在我的图书馆里。
我面临的问题是如何返回值的逻辑。您将传递IP列表,而不是传递IP。想象一下,你想连接到10个设备,其中5个正常,其他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个设备出现故障。
返回正确连接的结果和故障连接的错误的最佳方式是什么?连接可能由于以下几个原因而失败。
更新
我试过这个:
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}"
您可以返回一个Dictionary<Device, Task<Whatever>>
(其中Whatever
将是每个设备的结果)。您可以在开始连接到每个设备后立即返回。然后,任务将表示(在每个设备的基础上)连接是否已完成、失败或仍在进行。
除此之外,将任务用于异步结果几乎是使用TPL的惯用方法。。。并且在C#5中使用async/await使其变得更容易。
如果调用者想等待所有任务完成,并聚合任何异常,他们可以这样做