TPL返回值和异常

时间:2013-02-15 22:19:04

标签: c# .net task-parallel-library

我开发了一个连接设备并与设备一起操作的库。 例如:

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
    }
}

如果有人调用此方法,他们只会收到该例子,在这种情况下它可以很容易,但是例如,如果我有另一种方法,如Dictionary<Device, List<Logs>> GetLogs(List<Device> device)我将有5个设备包含数据,5个设备出现故障。< / p>

为正确的连接返回结果的最佳方法是什么,以及错误连接的错误是什么?连接可能由于多种原因而失败。

更新

我试过这个:

    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 个答案:

答案 0 :(得分:1)

您可以返回Dictionary<Device, Task<Whatever>>(其中Whatever将是每个设备的结果)。您可以立即返回 ,开始连接到每个设备。然后,该任务将代表(基于每个设备)连接是否已完成,失败或仍在进行中。

除此之外,使用异步结果的任务几乎是使用TPL的惯用方法......并且在使用async / await的C#5中变得更容易。

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