add async programming examples

add race condition examples
This commit is contained in:
2025-07-01 18:10:55 +02:00
parent df5e59e4bf
commit 44ffc8bd43
3 changed files with 322 additions and 127 deletions
+106
View File
@@ -0,0 +1,106 @@
// using System;
// using System.Threading;
// using System.Threading.Tasks;
//
// namespace Multithreading
// {
// internal class Program
// {
// public static void Main(string[] args)
// {
// Console.WriteLine("Program started");
//
// Console.WriteLine($"Entering Main Thread: {Thread.CurrentThread.ManagedThreadId}");
//
// // Task<int> randomNumberTask = Task.Run(() =>
// // {
// // Console.WriteLine($"Entering Thread: {Thread.CurrentThread.ManagedThreadId}");
// // Random random = new Random();
// // return random.Next();
// // });
// //
// // randomNumberTask.Wait();
// // int randomNumber = randomNumberTask.Result;
// // Console.WriteLine($"Random number: {randomNumber}");
//
// // only works in an async method
// // Task<int> randomNumberTask2 = Task.Run(() =>
// // {
// // Console.WriteLine($"Entering Thread: {Thread.CurrentThread.ManagedThreadId}");
// // Random random = new Random();
// // return random.Next();
// // });
// //
// // int randomNumber2 = await randomNumberTask2;
// // Console.WriteLine($"Random number: {randomNumber2}");
//
// // GetRandomNumber().Wait();
//
// // for (int i = 0; i < 10; i++)
// // {
// // SleepForAWhile(i).Wait();
// // }
//
// Task[] sleepTasks = new Task[10];
// for (int i = 0; i < 10; i++)
// {
// sleepTasks[i] = SleepForAWhile(i);
// }
//
// Task.WaitAll(sleepTasks);
//
// // Thread[] sleepThreads = new Thread[10];
// // for (int i = 0; i < 10; i++)
// // {
// // sleepThreads[i] = new Thread(SleepForAWhileThread);
// // sleepThreads[i].Start(i);
// // }
// //
// // for (int i = 0; i < 10; i++)
// // {
// // sleepThreads[i].Join();
// // }
//
// Console.WriteLine("Program ended");
// }
//
// private static async Task<int> GetRandomNumber()
// {
// Console.WriteLine($"GetRandomNumber Thread: {Thread.CurrentThread.ManagedThreadId}");
//
// Task<int> randomNumberTask = Task.Run(() =>
// {
// Console.WriteLine($"GetRandomNumber Task: {Thread.CurrentThread.ManagedThreadId}");
// Random random = new Random();
// return random.Next();
// });
//
// return await randomNumberTask;
// }
//
// private static async Task SleepForAWhile(int id)
// {
// Console.WriteLine($"SleepForAWhile in {Thread.CurrentThread.ManagedThreadId} for {id}");
// // await Task.Delay(TimeSpan.FromSeconds(1));
// // await Task.Run(() => Thread.Sleep(1000));
// Thread.Sleep(1000);
// Console.WriteLine($"SleptForAWhile in {Thread.CurrentThread.ManagedThreadId} for {id}");
//
// int randomNumber = await GetRandomNumber();
// Console.WriteLine($"randomNumber ({randomNumber}) in {Thread.CurrentThread.ManagedThreadId} for {id}");
// }
//
// private static void SleepForAWhileThread(object? id)
// {
// Console.WriteLine($"SleepForAWhileThread in {Thread.CurrentThread.ManagedThreadId} for {id}");
// Thread.Sleep(1000);
// Console.WriteLine($"SleptForAWhileThread in {Thread.CurrentThread.ManagedThreadId} for {id}");
//
// Task<int> getRandomNumberTask = GetRandomNumber();
// getRandomNumberTask.Wait();
// int randomNumber = getRandomNumberTask.Result;
// Console.WriteLine($"randomNumber ({randomNumber}) in {Thread.CurrentThread.ManagedThreadId} for {id}");
// }
// }
// }
//
@@ -0,0 +1,81 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Multithreading
{
internal class Program
{
private static object _fileHandleLock = new object();
public static void Main(string[] args)
{
Console.WriteLine("Program started");
// int[] numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9];
// Task[] tasks = new Task[10];
// Random random = new Random();
// for (int i = 0; i < tasks.Length; i++)
// {
// tasks[i] = Task.Run(() =>
// {
// Console.WriteLine($"Start Task {Thread.CurrentThread.ManagedThreadId}");
//
// for (int j = 0; j < 10; j++)
// {
// int index = random.Next(0, numbers.Length);
// Console.WriteLine(
// $"Before Random number {numbers[index]} in {Thread.CurrentThread.ManagedThreadId} with index {index}");
// // Thread.Sleep(random.Next(10, 100));
// numbers[index] = random.Next();
// // Thread.Sleep(random.Next(10, 100));
// Console.WriteLine(
// $"After Random number {numbers[index]} in {Thread.CurrentThread.ManagedThreadId}");
//
// lock (_fileHandleLock)
// {
// // File.AppendAllText("output.txt", $"{Thread.CurrentThread.ManagedThreadId}: {numbers[index]}\n");
// FileStream fs = File.OpenWrite("output.txt");
// string s = $"{Thread.CurrentThread.ManagedThreadId}: {numbers[index]}\n";
// byte[] bytes = Encoding.UTF8.GetBytes(s);
// fs.Write(bytes, 0, bytes.Length);
// fs.Close();
// fs.Dispose();
// }
// }
//
// Console.WriteLine($"Finished Task {Thread.CurrentThread.ManagedThreadId}");
// });
// }
//
// Task.WaitAll(tasks);
Dictionary<int, string> dictionary = new Dictionary<int, string>();
Task[] dictionaryTasks = new Task[1000];
Random random2 = new Random();
for (int i = 0; i < dictionaryTasks.Length; i++)
{
dictionaryTasks[i] = Task.Run(() =>
{
Thread.Sleep(100);
lock (dictionary) // option 2
{
int key = random2.Next();
if (!dictionary.ContainsKey(key))
{
dictionary.Add(key, $"Key {key}");
// dictionary.TryAdd(key, $"Key {key}"); // option 1
}
}
});
}
Task.WaitAll(dictionaryTasks);
Console.WriteLine("Program ended");
}
}
}
+135 -127
View File
@@ -1,127 +1,135 @@
using System; // using System;
using System.Threading; // using System.Threading;
using System.Threading.Tasks; // using System.Threading.Tasks;
//
namespace Multithreading // namespace Multithreading
{ // {
internal class Program // internal class Program
{ // {
public static void Main(string[] args) // public static void Main(string[] args)
{ // {
Console.WriteLine("Program started"); // Console.WriteLine("Program started");
//
// Task task = new Task(() => // // Task task = new Task(() =>
// { // // {
// for (int i = 0; i < 10; i++) // // for (int i = 0; i < 10; i++)
// { // // {
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
// Thread.Sleep(500); // // Thread.Sleep(500);
// } // // }
// }); // // });
// task.Start(); // // task.Start();
// // //
// Task task2 = Task.Run(() => // // Task task2 = Task.Run(() =>
// { // // {
// for (int i = 0; i < 10; i++) // // for (int i = 0; i < 10; i++)
// { // // {
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
// Thread.Sleep(500); // // Thread.Sleep(500);
// } // // }
// }); // // });
// // //
// task.Wait(); // // task.Wait();
// task2.Wait(); // // task2.Wait();
// // //
// Task task3 = new Task(() => // // Task task3 = new Task(() =>
// { // // {
// for (int i = 0; i < 10; i++) // // for (int i = 0; i < 10; i++)
// { // // {
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
// Thread.Sleep(500); // // Thread.Sleep(500);
// } // // }
// }); // // });
// task3.RunSynchronously(); // // task3.RunSynchronously();
//
// CancellationTokenSource cts = new CancellationTokenSource(); // // CancellationTokenSource cts = new CancellationTokenSource();
// CancellationToken token = cts.Token; // // CancellationToken token = cts.Token;
// // //
// Task task4 = Task.Run(() => // // Task task4 = Task.Run(() =>
// { // // {
// for (int i = 0; i < 10; i++) // // for (int i = 0; i < 10; i++)
// { // // {
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
// Thread.Sleep(500); // // Thread.Sleep(500);
// // //
// // token.ThrowIfCancellationRequested(); // // // token.ThrowIfCancellationRequested();
// if (token.IsCancellationRequested) // // if (token.IsCancellationRequested)
// { // // {
// // throw new TaskCanceledException(); // // // throw new TaskCanceledException();
// break; // // break;
// } // // }
// } // // }
// }, token); // // }, token);
// // //
// ConsoleKeyInfo keyInfo = Console.ReadKey(); // // ConsoleKeyInfo keyInfo = Console.ReadKey();
// if (keyInfo.Key == ConsoleKey.A) cts.Cancel(); // // if (keyInfo.Key == ConsoleKey.A) cts.Cancel();
// // //
// try // // try
// { // // {
// task4.Wait(token); // // task4.Wait(token);
// } // // }
// catch (OperationCanceledException e) // // catch (OperationCanceledException e)
// { // // {
// Console.WriteLine(e); // // Console.WriteLine(e);
// } // // }
// // //
// cts.Dispose(); // // cts.Dispose();
//
// CancellationTokenSource cts2 = new CancellationTokenSource(); // // CancellationTokenSource cts2 = new CancellationTokenSource();
Random random = new Random(); // // Random random = new Random();
Task[] tasks = new Task[10]; // // Task[] tasks = new Task[10];
for (int i = 0; i < tasks.Length; i++) // // for (int i = 0; i < tasks.Length; i++)
{ // // {
tasks[i] = Task.Run(() => // // tasks[i] = Task.Run(() =>
{ // // {
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) started"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) started");
for (int j = 0; j < 10; j++) // // for (int j = 0; j < 10; j++)
{ // // {
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {j}"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {j}");
Thread.Sleep(random.Next(100, 1000)); // // Thread.Sleep(random.Next(100, 1000));
// //
if (random.NextSingle() > 0.9f) // // if (random.NextSingle() > 0.9f)
{ // // {
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) aborted"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) aborted");
// cts2.Cancel(); // // cts2.Cancel();
throw new OperationCanceledException(); // // // throw new OperationCanceledException();
} // // }
} // //
// // cts2.Token.ThrowIfCancellationRequested();
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) ended"); // // }
}); // //
Console.WriteLine($"Task with id {tasks[i].Id} created"); // // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) ended");
Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}"); // // }, cts2.Token);
} // // Console.WriteLine($"Task with id {tasks[i].Id} created");
// // Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}");
try // // }
{ // //
Task.WaitAll(tasks); // // try
// Task.WaitAny(tasks); // // {
} // // Task.WaitAll(tasks, cts2.Token);
catch (OperationCanceledException) // // // Task.WaitAny(tasks);
{ // // }
Console.WriteLine("Operation was canceled"); // // catch (OperationCanceledException)
} // // {
catch (AggregateException) // // Console.WriteLine("Operation was canceled");
{ // // }
Console.WriteLine("One or more tasks canceled"); // // catch (AggregateException)
} // // {
// // Console.WriteLine("One or more tasks canceled");
for (int i = 0; i < tasks.Length; i++) // // }
{ // //
Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}"); // // for (int i = 0; i < tasks.Length; i++)
} // // {
// // Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}");
Console.WriteLine("Program ended"); // // }
} //
} // Parallel.For(0, 10000, i =>
} // {
// // doing some heavy calculation
// Console.WriteLine($"Thread ({Thread.CurrentThread.ManagedThreadId}): {i}");
// });
//
// Console.WriteLine("Program ended");
// }
// }
// }