Asynchronous programming is essential for building responsive applications, but it comes with challenges - particularly when you need to cancel operations.
Here's how to safely implement cancellation in C#.
The key to proper cancellation is the CancellationTokenSource class. This provides a token that can be passed to async methods and monitored for cancellation requests.
CancellationTokenSource
// Create a cancellation source with timeout var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10)); var token = cts.Token; try { // Pass token to async operations await DoLongRunningTaskAsync(token); } catch (OperationCanceledException) { // Handle cancellation gracefully Console.WriteLine("Operation was canceled"); } finally { // Always dispose the CancellationTokenSource cts.Dispose(); }
When writing cancellable async methods, check for cancellation at appropriate points:
async Task DoLongRunningTaskAsync(CancellationToken token) { // Check before starting expensive work token.ThrowIfCancellationRequested(); for (int i = 0; i < 100; i++) { // Periodically check during loops if (token.IsCancellationRequested) { // Clean up resources if needed CleanupResources(); // Then throw the standard exception throw new OperationCanceledException(token); } await Task.Delay(100, token); // Built-in methods accept tokens } }
token.ThrowIfCancellationRequested()
OperationCanceledException
By following these patterns, you can ensure your async operations respond promptly to cancellation requests while maintaining clean, resource-efficient code.
When working with SQL Server, you may often need to count the number of unique values in a specific column. This is useful for analyzing data, detecting duplicates, and understanding dataset distributions.
To count the number of unique values in a column, SQL Server provides the COUNT(DISTINCT column_name) function. Here’s a simple example:
COUNT(DISTINCT column_name)
SELECT COUNT(DISTINCT column_name) AS distinct_count FROM table_name;
This query will return the number of unique values in column_name.
column_name
If you need to count distinct combinations of multiple columns, you can use a subquery:
SELECT COUNT(*) AS distinct_count FROM (SELECT DISTINCT column1, column2 FROM table_name) AS subquery;
This approach ensures that only unique pairs of column1 and column2 are counted.
column1
column2
By leveraging COUNT(DISTINCT column_name), you can efficiently analyze your database and extract meaningful insights. Happy querying!
Storing passwords as plain text is dangerous. Instead, you should hash them using a strong, slow hashing algorithm like BCrypt, which includes built-in salting and resistance to brute-force attacks.
Step 1: Install BCrypt NuGet Package
Before using BCrypt, install the BCrypt.Net-Next package:
dotnet add package BCrypt.Net-Next
or via NuGet Package Manager:
Install-Package BCrypt.Net-Next
Step 2: Hash a Password
Use BCrypt.HashPassword() to securely hash a password before storing it:
using BCrypt.Net; string password = "mySecurePassword123"; string hashedPassword = BCrypt.HashPassword(password); Console.WriteLine(hashedPassword); // Output: $2a$12$...
Step 3: Verify a Password
To check a user's login attempt, use BCrypt.Verify():
bool isMatch = BCrypt.Verify("mySecurePassword123", hashedPassword); Console.WriteLine(isMatch); // Output: True
Ensuring proper hashing should be at the top of your list when it comes to building authentication systems.
XML (Extensible Markup Language) is a widely used format for storing and transporting data.
In C#, you can create XML files efficiently using the XmlWriter and XDocument classes. This guide covers both methods with practical examples.
XmlWriter
XDocument
XmlWriter provides a fast and memory-efficient way to generate XML files by writing elements sequentially.
using System; using System.Xml; class Program { static void Main() { using (XmlWriter writer = XmlWriter.Create("person.xml")) { writer.WriteStartDocument(); writer.WriteStartElement("Person"); writer.WriteElementString("FirstName", "John"); writer.WriteElementString("LastName", "Doe"); writer.WriteElementString("Age", "30"); writer.WriteEndElement(); writer.WriteEndDocument(); } Console.WriteLine("XML file created successfully."); } }
Output (person.xml):
person.xml
<?xml version="1.0" encoding="utf-8"?> <Person> <FirstName>John</FirstName> <LastName>Doe</LastName> <Age>30</Age> </Person>
The XDocument class from LINQ to XML provides a more readable and flexible way to create XML files.
using System; using System.Xml.Linq; class Program { static void Main() { XDocument doc = new XDocument( new XElement("Person", new XElement("FirstName", "John"), new XElement("LastName", "Doe"), new XElement("Age", "30") ) ); doc.Save("person.xml"); Console.WriteLine("XML file created successfully."); } }
This approach is ideal for working with complex XML structures and integrating LINQ queries.
Writing XML files in C# is straightforward with XmlWriter and XDocument. Choose the method that best suits your needs for performance, readability, and maintainability.
Register for my free weekly newsletter.