2

子アクティビティのコレクションを使用して、カスタムのネイティブアクティビティを作成しました。いずれかのアクティビティが失敗した場合、子アクティビティをキャンセルしようとしています。context.CancelChildren()を呼び出すと、子アクティビティでキャンセルが呼び出されません。

以下に例を示します。

public sealed class MyCompositeActivity : NativeActivity
{
    public Collection<Activity> Activities { get; set; }

    protected override void Execute(NativeActivityContext context)
    {
        ScheduleActivity(context);
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        base.CacheMetadata(metadata);

        metadata.SetChildrenCollection(Activities);
     }

    private void ScheduleActivity(NativeActivityContext context)
    {
        // Get next activity
        ....
        context.ScheduleActivity(nextActivity, OnActivityCompleted, OnActivityFaulted);
    }

    private static void OnActivityFaulted(NativeActivityFaultContext context, Exception exception, ActivityInstance faultedInstance)
    {
        context.HandleFault();
        context.CancelChildren();
    }
}
4

1 に答える 1

1

キャンセルするには、アクティビティを実行する必要があります。つまり、ブックマークが再開されるのを待っている非同期アクティビティか、子アクティビティが完了するのを待っている複合アクティビティのいずれかです。キャンセルが発生する最も一般的な場所は、1つだけではありませんが、複数の並列ブランチがあり、1つのブランチが例外をスローする場合です。他のバンチは、未処理の例外があったため実行を継続できず、キャンセルされます。

提供したコードサンプルから、並列動作はないようで、前のアクティビティが完了した後にアクティビティをスケジュールしています。実行中の単一のアクティビティがエラーをスローするため、キャンセルする他のアクティビティはありません。

于 2012-11-28T18:10:45.330 に答える