Skip to content

The Dummy Programmer

Stories of daily programming

  • Home
  • My other dummy projects
  • Games
    • Space Y: An Asteroids clone
  • Services
    • What’s my user agent
    • What’s my IP address
  • 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

System.Net.Sockets.SocketException (0x80004005): No such host is known ASP.NET
Push notifications library with C# and .NET Framework C#
C# async / await behind the scenes C#
Capture screen using C# C#
Telerik RadGrid’s pagination hangs ASP.NET
A chat program built in C# with .NET socket library C#

Search

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)
  • .NET 7 (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)
  • Games (2)
  • Google Chrome (1)
  • GSuite (1)
  • HTML (1)
  • Imagick (2)
  • Javascript (1)
  • Kindle (1)
  • LAMP (3)
  • Linux (7)
  • 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 (20)
  • Sql Server 2016 (14)
  • Sql Server 2019 (1)
  • SSL (4)
  • Task scheduler (1)
  • Telerik ASP.NET AJAX (2)
  • The Dummy Programmer Chat (2)
  • Threading (5)
  • Tools (1)
  • TPL (3)
  • TypeScript (3)
  • Ubuntu (4)
  • Virtualization software (3)
  • Visual Studio (1)
  • Visual Studio Code (2)
  • VueJS (1)
  • Web fonts (1)
  • Web programming (6)
  • Windows (12)
  • Windows 10 (15)
  • Windows Forms (1)
  • Windows Server (6)

Copyright © 2024 The Dummy Programmer | Privacy Policy | Terms of use |

Powered by PressBook Masonry Dark

Manage Cookie Consent
This site doesn’t collect user personal data and doesn’t install profiling or analytical cookies, either its own or from third parties. Read our privacy policy for more info.
Functional Always active
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Manage options Manage services Manage {vendor_count} vendors Read more about these purposes
View preferences
{title} {title} {title}