0

最終的に TaskContinuationOptions を使用する方法はありますか?

これが私のコードです

        ShowLoading();
        Task.Factory.StartNew((Action)(() =>
        {
            _broker.SetDrugDataFromAPI(newDrug);

        })).ContinueWith(x => 
        {
            lock (this)
            {
                //Do Something to UI
            }
        }, _uiScheduler).ContinueWith(x =>
        {
            //Do Somehting after change UI
        }).ContinueWith(x =>
        {
            HideLoading();
        }, TaskContinuationOptions.OnlyOnFaulted);

これが私の質問です

last ContinueWith をfinallyのように使いたかったのです。それで、最後の ContinueWith フレーズを次のように変更しました

        }).ContinueWith(x =>
        {
            HideLoading();
        }, TaskContinuationOptions.OnlyOnRanToCompletion | 
           TaskContinuationOptions.OnlyOnFaulted);

最後のタスクが完了または失敗したときに使用されると思いました。

しかし、それはエラーをスローします。

私の問題を解決する良い方法があることを願っています。

私の質問を読んでくれてありがとう。

4

1 に答える 1

2

a を指定しない場合は、障害 (例外)、キャンセル、または正常に完了したTaskContinuationOptionsかどうかにかかわらず、すべての状態で実行されます。Task

例えば:

using System;
using System.Threading;
using System.Threading.Tasks;

public class Program
{
    public static async Task Main()
    {
        using (var cts = new CancellationTokenSource())
        {
            var task = Task.CompletedTask
            .ContinueWith(t => Console.WriteLine("Run after completed"))
            .ContinueWith(t => throw new Exception("Blow up"))
            .ContinueWith(t => Console.WriteLine("Run after exception"))
            .ContinueWith(t => cts.Cancel())
            .ContinueWith(t => Console.WriteLine("This will never be hit because we have been cancelled"), cts.Token)
            .ContinueWith(t => Console.WriteLine("Run after cancelled."));

            await task;
        }
    }
}

このプログラムは、次の出力を生成します。

Run after completed
Run after exception
Run after cancelled.
于 2018-03-13T03:15:51.287 に答える