3

C# の backgroundworker からアップグレードするために、新しい async await 機能を使用しています。次のコードでは、ContinueWith メソッドを使用して複数のタスクの実行を複製しようとしています。

        Task t1 = new Task
        (
            () =>
            {
                Thread.Sleep(10000);

                // make the Task throw an exception
                MessageBox.Show("This is T1");
            }
        );

        Task t2 = t1.ContinueWith
        (
            (predecessorTask) =>
            {

                if (predecessorTask.Exception != null)
                {
                    MessageBox.Show("Predecessor Exception within Continuation");

                    return;
                }

                Thread.Sleep(1000);
                MessageBox.Show("This is Continuation");
            },

            TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnRanToCompletion
        );

        t1.Start();

        try
        {
           t1.Wait(); <------ Comment 
           t2.Wait(); <------ Comment 
        }
        catch (AggregateException ex)
        {
            MessageBox.Show(ex.InnerException.Message);
        }  

私の質問は、t1.wait と t2.wait タスクが UI をブロックしていないとコメントしたときです。ただし、スレッドが完了するまで t1.wait と t2.wait UI ブロックのコメントを外すと。望ましい動作は、UI をブロックせずに try/catch ブロックでエラーをキャッチすることです。私は何が欠けていますか?

4

3 に答える 3

3

を使用するときTask.Wait()は、基本的に「ここで私のタスクが完了するのを待ってください」と言っています。それがあなたがスレッドをブロックしている理由です。タスクで例外を処理する良い方法は、次のようにTask.ContinueWithオーバーロードとパスOnlyOnFaultedを使用TaskContinuationOptionすることです。

Task yourTask = new Task {...};
yourTask.ContinueWith( t=> { /*handle expected exceptions*/ }, TaskContinuationOptions.OnlyOnFaulted );
于 2013-10-06T07:37:23.423 に答える