Monday, May 29, 2017

Tasks zusammanhängen mit ContinueWith und Fehlerbehandlung




      private void CreateAnys(Dictionary<string,Action> createAnyDict)
        {
            var sbNames= new StringBuilder();
            foreach (var AnyName in createAnyDict.Keys)
            {
                sbNames.Append(AnyName);
            }
            if (MessageBox.Show($"create {sbNames} Any ?", "Create Any", MessageBoxButton.YesNo) ==
                MessageBoxResult.No) return;

            SetBusy();

            var firstTask = new Task(() => SetStatusLabel("Creating Any(s)"));
            var nextTask = firstTask;
            foreach (var dictEntry in createAnyDict)
            {

                nextTask = nextTask.ContinueWith(antecedent =>
                {
                    Trace.WriteLine("Result last Task:");
                    if (antecedent.IsFaulted)
                    {
                        Trace.WriteLine("Error: "+antecedent.Exception?.Message);
                    }
                    else if (antecedent.IsCanceled)
                    {
                        Trace.WriteLine("Cancled !");
                    }
                    else
                    {
                        Trace.WriteLine("Succeeded !");
                    }
                    SetStatusLabel($"creating  Any {dictEntry.Key}");
                    try
                    {
                        dictEntry.Value.Invoke();
                    }
                    catch (Exception ex)
                    {
                        Trace.WriteLine($"Error creating {dictEntry.Key}:{ex.Message}");
                    }
                });

            }
            nextTask = nextTask.ContinueWith((t) =>
                                             {
                                                 SetStatusLabel("finished creating Any(s) - ready ...");
                                                 SetReady();
                                             });

            try
            {
                firstTask.Start();
                //task0.Wait();
            }
            catch (AggregateException ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

No comments: