Skip to content

The Dummy Programmer

Stories of daily programming

  • Home
  • The Dummy Programmer Robot
    • Overview
    • Version history & downloads
    • Tutorials
      • TDP Robot – The basics
      • A simple SQL Server backup solution
      • A simple SQL Server backup solution – A next step
  • My other dummy projects
  • Games
    • Space Y: An Asteroids clone
  • Services
    • What’s my user agent
    • What’s my IP address
  • Donate
  • About
  • Toggle search form

Working with C# async / await keywords (part 3 of 3)

Posted on June 15, 2020June 15, 2020 By

In previous posts we talked about how use the Task object, async / await keywords and how to cancel a running task. In this last post I want to talk about another important point regarding task management: exception handling.

We will resume the example program created in the first post, which you can download here.

Let’s add a new button to the main form. We will call it “Start task with exception”.

We will also add an asynchronous method called “LongTaskWithExceptionAsync” and an event handler for the click event on the new button. Here is the code:

private Task<int> LongTaskWithExceptionAsync()
{
   Task<int> T1 = new Task<int>(() =>
   {
      System.Diagnostics.Trace.WriteLine("BtnStartTaskWithException_Click->Task 1->Thread ID: " + System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());

      System.Threading.Thread.Sleep(5000);
      int a = 1, b = 1;

      if (a == b)
        throw new ApplicationException("This is an exception!");

        // Return a 'random' value
        return DateTime.Now.Second;
    });
    T1.Start();
    return T1;
}

private async void BtnStartTaskWithException_Click(object sender, EventArgs e)
{
  System.Diagnostics.Trace.WriteLine("BtnStartTaskWithException_Click->Thread ID: " + 
  System.Threading.Thread.CurrentThread.ManagedThreadId.ToString());

  try
  {
     int Val = await LongTaskWithExceptionAsync();
  }
  catch (Exception ex)
  {
     MessageBox.Show(ex.ToString());
  }
}

As you can see, the call to LongTaskWithExceptionAsync is encapsulated in a try / catch block and the exception thrown is correctly caught. This also happens when you call, for example, the Wait method or the Result property of the Task object, but with a difference…

If you use the Wait method or the Result property, the exception is encapsulated in an AggregateExceptions object, and so you have to catch this kind of exception object. So add another button named “Start task with aggregate exception”:

And add this click event handler:

private void BtnStartTaskWithAggrException_Click(object sender, EventArgs e)
{
  try
  {
    Task<int> T = LongTaskWithExceptionAsync();
    T.Wait();
  }
  catch (AggregateException ex)
  {
    foreach (Exception inner_ex in ex.InnerExceptions)
    {
      if (inner_ex is ApplicationException)
      {
        MessageBox.Show(inner_ex.ToString());
      }
      else
      {
        throw;
      }
    }
  }
}

The AggregateException object doesn’t seem to make much sense for a single task and a single exception, but it makes sense if you use, for example, the Task.WaitAll method… but this is another story… 😉

That’s all for now, see you soon to talk about other topics!

C#, Threading, TPL

Post navigation

Previous Post: Working with C# async / await keywords (part 2 of 3)
Next Post: Create a folder starting with dot in Windows

Related Posts

A chat program built in C# with .NET socket library C#
Using The Dummy Programmer Chat Client C#
Capture screen using C# C#
Working with C# async / await keywords (part 1 of 3) C#
Telerik RadGrid’s pagination hangs ASP.NET
Push notifications library with C# and .NET Framework C#

Search

Subscribe to our newsletter

Related posts

  • Working with C# async / await keywords (part 1 of 3)
  • Working with C# async / await keywords (part 2 of 3)
  • C# async / await behind the scenes
  • Windows 10 search no more working!!

Categories

  • .NET 6 (1)
  • AJAX (1)
  • Android (2)
  • Apache (4)
  • ASP.NET (9)
  • ASP.NET MVC (3)
  • Avalonia UI (1)
  • BCP (1)
  • Bitlocker (2)
  • C# (14)
  • CentOS (4)
  • ClosedXML (1)
  • CLR (1)
  • DNS (1)
  • Encryption (3)
  • Excel (2)
  • FuelPHP (3)
  • Google Chrome (1)
  • GSuite (1)
  • HTML (1)
  • Imagick (2)
  • Javascript (1)
  • Kindle (1)
  • LAMP (3)
  • Linux (6)
  • MariaDB (2)
  • Mathematics (2)
  • MySql (4)
  • NPOI (1)
  • Office 365 (1)
  • Perl (1)
  • PHP (6)
  • Programming (1)
  • Remote desktop (1)
  • SFTP (2)
  • Sockets (3)
  • Sql Server (18)
  • Sql Server 2016 (14)
  • Sql Server 2019 (1)
  • SSL (2)
  • Task scheduler (1)
  • Telerik ASP.NET AJAX (2)
  • The Dummy Programmer Chat (2)
  • The Dummy Programmer Robot (6)
  • Threading (5)
  • Tools (1)
  • TPL (3)
  • TypeScript (3)
  • Ubuntu (4)
  • Virtualization software (3)
  • Visual Studio (1)
  • Visual Studio Code (2)
  • Web fonts (1)
  • Web programming (6)
  • Windows (12)
  • Windows 10 (15)
  • Windows Forms (1)
  • Windows Server (5)

Copyright © 2022 The Dummy Programmer | Privacy Policy |

Powered by PressBook Masonry Dark