-2

次のシナリオを検討してください。

オブジェクトを返すタスクがあります。これは次のタイプであるとしましょう。

class A
{
string success;
}

これで、タスクの本体は次のようになります。

{
return new A() { success = "yes" }
}

このタスクの外側は、それが継続的なタスクであるか何かであるかは関係ありません。重要なのは、そのタスクから戻ったときに、この返されたオブジェクトをtask.Result.statusで読み取ることができるということです。

私が抱えている問題は、try / catchブロック内でその種類のオブジェクトを返したい場合、task.Result.statusがnullであり、task.ResultがAggregatedExceptionタイプであるということです。したがって、たとえば:

//(Task body)
{
{
try
{
//something throwing exception
}
catch(Exception exc)
{
return new A() { success = "yes" }
}
}

現在受け取っているAggregatedExceptionの代わりに、実行がそのタスクから戻ったときに、catchブロックに返されるオブジェクトを取得する方法を探しています。

「なぜ欲しいのか」「何がポイントなのか」などの通常のフォーラムの「回答」にはご遠慮ください。そのような回答には興味がありません。

それができず、事実を知っている場合(おそらく、例外をスローするときのタスクは、何があっても常にAggregatedExceptionを返します)、とても簡単に教えてください。一方、それが可能であれば、私はそれをどのように達成できるかを評価したいと思います。

ルーカス

4

2 に答える 2

1

あなたの質問はもっとよく説明できますが、私が理解しているように、これはあなたがやりたいことであり、うまくいくはずです。

//(Task body)
{
    A result = null;
    try
    {
        //something that might throwing exception but could also new the result
    }
    catch(Exception)
    {
        result = new A() { success = "yes" }
    }

    return result;
}

タスク内でキャッチされた例外は、AggregateExceptionまで伝播しないようにする必要があります。それでも問題が解決しない場合は、コードの他の場所で何か問題が発生しています。

于 2012-11-29T11:30:11.700 に答える
0

感情は私を最大限に活用しました。

いつものように、問題は私が以前は見ることができなかったものでした。

問題の根本を見つけるために問題を単純化しようとしました。そのため、上記のコードは非常に基本的でした。タスクの例外処理は非常に複雑であることが判明しました。特に、内部タスクや待機呼び出しを処理する場合はそうです。

私はinnerTask.Wait()メソッドを呼び出していましたが、そのメソッドはAggregate例外をスローしていました。

http://msdn.microsoft.com/en-us/library/dd235635.aspx

innerTask実行が実行されていて、オブジェクトを再取得していても、外部タスクはそれ以前に例外を処理していました。

気付いたら、修正はとてもシンプルで簡単でした。

于 2012-11-29T12:27:10.050 に答える