When is the System.Threading.Task useful?

18,639

There are two main advantages in using Tasks:

  1. Task can represent any result that will be available in the future (the general concept is not specific to .Net and it's called future), not just a computation. This is especially important with async-await, which uses Tasks for asynchronous operations. Since the operation that gets the result might fail, Tasks can also represent failures.
  2. Task has lots of methods to operate on them. You can synchronously wait until it finishes (Wait()), wait for its result (Result), set up some operation when the Task finishes (ContinueWith()) and also some methods that work on several Tasks (WaitAll(), WaitAny(), ContinueWhenAll()). All of this is possible using other parallel processing methods, but you would have to do it manually.

And there are also some smaller advantages to using Task:

  1. You can use a custom TaskScheduler to decide when and where will the Task run. This can be useful for example if you want to run a Task on the UI thread, limit the degree of parallelism or have a Task-level readers–writer lock.
  2. Tasks support cooperative cancellation through CancellationToken.
  3. Tasks that represent computations have some performance improvements. For example, they use work-stealing queue for more efficient processing and they also support inlining (executing Task that hasn't started yet on a thread that synchronously waits for it).
Share:
18,639
William
Author by

William

Updated on June 05, 2022

Comments

  • William
    William over 1 year

    I have used most of the Threading library extensively. I am fairly familiar with creating new Threads, creating BackgroundWorkers and using the built-in .NET ThreadPool (which are all very cool).

    However, I have never found a reason to use the Task class. I have seen maybe one or two examples of people using them, but the examples weren't very clear and they didn't give a high-level overview of why one should use a task instead of a new thread.

    Question 1: From a high-level, when is using a task useful versus one of the other methods for parallelism in .NET?

    Question 2: Does anyone have a simple and/or medium difficulty example demonstrating how to use tasks?

  • Keith Robertson
    Keith Robertson about 9 years
    +1, excellent answer. However, I would consider "Smaller #1" to be a main advantage, and replace "custom" with "specific". There are two commonly used built-in TaskSchedulers, one for background tasks which can run on any ThreadPool thread, and one for code which must run in a specific SynchronizationContext, e.g. on a UI thread. Point 2: You need not write a custom scheduler for this feature to be useful. Point 1: It's a huge benefit that the same model can be used for foreground and background units of future work.
  • Jeb50
    Jeb50 over 5 years
    A sophisticated concept answered in simple and plain English, hats-off!