Background tasks and how to use them. Stale Cache example in C#

Oct 23 2023

Many thanks to the sponsors who make it possible for this newsletter to be free for readers.

Today's issue is sponsored by Neo4J Nodes 2023

Neo4j organizes a great conference - 𝐍𝐎𝐃𝐄𝐒 2023. It's an online conference for developers, data scientists, architects, and data analysts across the globe.
Whether you're a beginner or an expert, this 24-𝐡𝐨𝐮𝐫 𝐅𝐑𝐄𝐄 𝐞𝐯𝐞𝐧𝐭 has something for everyone.
Expect 24 hours of live sessions, lightning talks, and more in every major time zone, insights in three tracks (intelligent applications, machine learning and AI, and visualization), and the latest developments in LLMs, graph neural networks, data ethics, and tech stack integrations, while also having the opportunity to connect with speakers, exchange ideas, and find collaboration opportunities in the community.

The background

In .NET, background tasks are asynchronous operations that run independently of the main application thread.

They are used to perform tasks that should not block the main thread, such as long-running computations, I/O operations, or tasks that can be executed concurrently.

Let's see how to implement this feature.

Simple Implementation

There are various ways to implement background tasks in .NET, but one common approach is to use asynchronous programming with async and await.

This allows you to run code in the background without blocking the main thread.

Here's an example of how to create and execute a background task in a console application:

Create and Execute Background Task in Console Application

Real-world use cases in applications

1. Email Notifications:

• Why: Sending email notifications can be time-consuming and subject to network delays. You don't want the main application thread to wait for email deliveries to complete.

• How: Use a background task to send email notifications asynchronously, allowing the main application to continue processing user requests without delays.

2. Image and File Processing:

• Why: Tasks like image resizing, file uploads, or video transcoding can be resource-intensive and time-consuming.

• How: Offload these tasks to background threads or processes, allowing the main thread to serve user requests promptly without experiencing delays.

3. Database Cleanup and Maintenance:

• Why: In applications with databases, routine maintenance tasks like archiving, purging old data, or reindexing can be crucial but time-consuming.

• How: Implement background tasks to perform database maintenance activities during non-peak hours, preventing these tasks from affecting the application's responsiveness during regular usage.

4. Cache Maintenance

• Why: Caches can accumulate stale data over time, leading to inefficiency and increased memory usage.

• How: Use background tasks to periodically clean up expired or unnecessary cache items, ensuring that the cache remains efficient and doesn't impact application performance.

• Let's take this example and implement a background task on it.

Create Simple Cache Manager with Background Task

In this example, the CacheManager class manages the cache and has a background task (StartCacheCleanupTask) that periodically removes stale cache items based on their expiration timestamps. This ensures that the cache remains up-to-date and doesn't grow indefinitely.

Let's see how it's implemented:

Cache Manager implementation

Where the CacheItem represents the item we are adding to cache:

Cache item implementation

Background tasks for cache cleanup help maintain application performance by keeping the cache efficient and avoiding the use of stale data. It's an essential technique for applications that heavily rely on caching to improve response times.


Background tasks are a fundamental and versatile feature in .NET applications, playing a crucial role in enhancing performance, responsiveness, and overall user experience.

Here are some key takeaways:

- Enhanced Responsiveness:

Background tasks prevent the main application thread from becoming blocked by long-running operations, keeping the user interface responsive and preventing application freezes.

- Improved Efficiency:

By running resource-intensive tasks in the background, applications can use system resources more efficiently, leading to better performance and scalability.

- Concurrency:

Background tasks enable parallel execution of tasks, allowing applications to process multiple operations concurrently, which is essential for handling large workloads.

- Scheduled Maintenance:

They are ideal for automating routine tasks like cache cleanup, data synchronization, and database maintenance, reducing manual intervention and ensuring data accuracy.

- Optimized Resource Usage:

Background tasks help manage resource-intensive operations, such as image processing or email delivery, efficiently, preventing resource exhaustion.

- Optimized Resource Usage:

Background tasks help manage resource-intensive operations, such as image processing or email delivery, efficiently, preventing resource exhaustion.

- Scalability:

They contribute to the scalability of an application, making it capable of handling increased load and demands without a significant degradation in performance.

That's all from me for today.

dream BIG!

Join 10,950+ subscribers to improve your .NET Knowledge.

There are 3 ways I can help you:

Design Patterns Simplified ebook

Go-to resource for understanding the core concepts of design patterns without the overwhelming complexity. In this concise and affordable ebook, I've distilled the essence of design patterns into an easy-to-digest format. It is a Beginner level. Check out it here.


Promote yourself to 10,950+ subscribers by sponsoring this newsletter.

Join .NET Pro Weekly Newsletter

Every Monday morning, I share 1 actionable tip on C#, .NET & Arcitecture topic, that you can use right away.

Subscribe to
.NET Pro Weekly

Subscribe to the .NET Pro Weekly and be among the 10,950+ subscribers gaining practical tips and resources to enhance your .NET expertise.