0

デバイスと接続して動作するライブラリを開発しました。例えば:

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つのデバイスがあるような別のメソッドがある場合です。

正しい接続の結果と障害のある接続のエラーを返すための最良の方法は何ですか?接続はいくつかの理由で失敗する可能性があります。

アップデート

私はこれを試しました:

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

1 に答える 1

1

を返すことができます(各デバイスの結果はDictionary<Device, Task<Whatever>>どこになりますか)。各デバイスへの接続を開始すると、すぐWhateverにそれを返すことができます。次に、タスクは、接続が完了したか、失敗したか、またはまだ進行中であるかを(デバイスごとに)表します。

他のことは別として、非同期結果にタスクを使用することは、TPLを使用する慣用的な方法です...そしてasync / awaitを使用してC#5で簡単になります。

呼び出し元がすべてのタスクが完了するのを待ち、例外を集約したい場合は、そうすることができます。

于 2013-02-15T22:26:51.473 に答える