add async programming examples
add race condition examples
This commit is contained in:
@@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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");
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
// }
|
||||||
Reference in New Issue
Block a user