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.Threading;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Multithreading
|
||||
{
|
||||
internal class Program
|
||||
{
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
Console.WriteLine("Program started");
|
||||
|
||||
// Task task = new Task(() =>
|
||||
// {
|
||||
// for (int i = 0; i < 10; i++)
|
||||
// {
|
||||
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// Thread.Sleep(500);
|
||||
// }
|
||||
// });
|
||||
// task.Start();
|
||||
// using System;
|
||||
// using System.Threading;
|
||||
// using System.Threading.Tasks;
|
||||
//
|
||||
// Task task2 = Task.Run(() =>
|
||||
// namespace Multithreading
|
||||
// {
|
||||
// for (int i = 0; i < 10; i++)
|
||||
// internal class Program
|
||||
// {
|
||||
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// Thread.Sleep(500);
|
||||
// }
|
||||
// public static void Main(string[] args)
|
||||
// {
|
||||
// Console.WriteLine("Program started");
|
||||
//
|
||||
// // Task task = new Task(() =>
|
||||
// // {
|
||||
// // for (int i = 0; i < 10; i++)
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// // Thread.Sleep(500);
|
||||
// // }
|
||||
// // });
|
||||
// // task.Start();
|
||||
// //
|
||||
// // Task task2 = Task.Run(() =>
|
||||
// // {
|
||||
// // for (int i = 0; i < 10; i++)
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// // Thread.Sleep(500);
|
||||
// // }
|
||||
// // });
|
||||
// //
|
||||
// // task.Wait();
|
||||
// // task2.Wait();
|
||||
// //
|
||||
// // Task task3 = new Task(() =>
|
||||
// // {
|
||||
// // for (int i = 0; i < 10; i++)
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// // Thread.Sleep(500);
|
||||
// // }
|
||||
// // });
|
||||
// // task3.RunSynchronously();
|
||||
//
|
||||
// // CancellationTokenSource cts = new CancellationTokenSource();
|
||||
// // CancellationToken token = cts.Token;
|
||||
// //
|
||||
// // Task task4 = Task.Run(() =>
|
||||
// // {
|
||||
// // for (int i = 0; i < 10; i++)
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// // Thread.Sleep(500);
|
||||
// //
|
||||
// // // token.ThrowIfCancellationRequested();
|
||||
// // if (token.IsCancellationRequested)
|
||||
// // {
|
||||
// // // throw new TaskCanceledException();
|
||||
// // break;
|
||||
// // }
|
||||
// // }
|
||||
// // }, token);
|
||||
// //
|
||||
// // ConsoleKeyInfo keyInfo = Console.ReadKey();
|
||||
// // if (keyInfo.Key == ConsoleKey.A) cts.Cancel();
|
||||
// //
|
||||
// // try
|
||||
// // {
|
||||
// // task4.Wait(token);
|
||||
// // }
|
||||
// // catch (OperationCanceledException e)
|
||||
// // {
|
||||
// // Console.WriteLine(e);
|
||||
// // }
|
||||
// //
|
||||
// // cts.Dispose();
|
||||
//
|
||||
// // CancellationTokenSource cts2 = new CancellationTokenSource();
|
||||
// // Random random = new Random();
|
||||
// // Task[] tasks = new Task[10];
|
||||
// // for (int i = 0; i < tasks.Length; i++)
|
||||
// // {
|
||||
// // tasks[i] = Task.Run(() =>
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) started");
|
||||
// // for (int j = 0; j < 10; j++)
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {j}");
|
||||
// // Thread.Sleep(random.Next(100, 1000));
|
||||
// //
|
||||
// // if (random.NextSingle() > 0.9f)
|
||||
// // {
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) aborted");
|
||||
// // cts2.Cancel();
|
||||
// // // throw new OperationCanceledException();
|
||||
// // }
|
||||
// //
|
||||
// // cts2.Token.ThrowIfCancellationRequested();
|
||||
// // }
|
||||
// //
|
||||
// // Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) ended");
|
||||
// // }, cts2.Token);
|
||||
// // Console.WriteLine($"Task with id {tasks[i].Id} created");
|
||||
// // Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}");
|
||||
// // }
|
||||
// //
|
||||
// // try
|
||||
// // {
|
||||
// // Task.WaitAll(tasks, cts2.Token);
|
||||
// // // Task.WaitAny(tasks);
|
||||
// // }
|
||||
// // catch (OperationCanceledException)
|
||||
// // {
|
||||
// // Console.WriteLine("Operation was 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}");
|
||||
// // }
|
||||
//
|
||||
// Parallel.For(0, 10000, i =>
|
||||
// {
|
||||
// // doing some heavy calculation
|
||||
// Console.WriteLine($"Thread ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// });
|
||||
//
|
||||
// task.Wait();
|
||||
// task2.Wait();
|
||||
//
|
||||
// Task task3 = new Task(() =>
|
||||
// {
|
||||
// for (int i = 0; i < 10; i++)
|
||||
// {
|
||||
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// Thread.Sleep(500);
|
||||
// }
|
||||
// });
|
||||
// task3.RunSynchronously();
|
||||
|
||||
// CancellationTokenSource cts = new CancellationTokenSource();
|
||||
// CancellationToken token = cts.Token;
|
||||
//
|
||||
// Task task4 = Task.Run(() =>
|
||||
// {
|
||||
// for (int i = 0; i < 10; i++)
|
||||
// {
|
||||
// Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {i}");
|
||||
// Thread.Sleep(500);
|
||||
//
|
||||
// // token.ThrowIfCancellationRequested();
|
||||
// if (token.IsCancellationRequested)
|
||||
// {
|
||||
// // throw new TaskCanceledException();
|
||||
// break;
|
||||
// Console.WriteLine("Program ended");
|
||||
// }
|
||||
// }
|
||||
// }, token);
|
||||
//
|
||||
// ConsoleKeyInfo keyInfo = Console.ReadKey();
|
||||
// if (keyInfo.Key == ConsoleKey.A) cts.Cancel();
|
||||
//
|
||||
// try
|
||||
// {
|
||||
// task4.Wait(token);
|
||||
// }
|
||||
// catch (OperationCanceledException e)
|
||||
// {
|
||||
// Console.WriteLine(e);
|
||||
// }
|
||||
//
|
||||
// cts.Dispose();
|
||||
|
||||
// CancellationTokenSource cts2 = new CancellationTokenSource();
|
||||
Random random = new Random();
|
||||
Task[] tasks = new Task[10];
|
||||
for (int i = 0; i < tasks.Length; i++)
|
||||
{
|
||||
tasks[i] = Task.Run(() =>
|
||||
{
|
||||
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) started");
|
||||
for (int j = 0; j < 10; j++)
|
||||
{
|
||||
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}): {j}");
|
||||
Thread.Sleep(random.Next(100, 1000));
|
||||
|
||||
if (random.NextSingle() > 0.9f)
|
||||
{
|
||||
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) aborted");
|
||||
// cts2.Cancel();
|
||||
throw new OperationCanceledException();
|
||||
}
|
||||
}
|
||||
|
||||
Console.WriteLine($"Task ({Thread.CurrentThread.ManagedThreadId}) ended");
|
||||
});
|
||||
Console.WriteLine($"Task with id {tasks[i].Id} created");
|
||||
Console.WriteLine($"Task ({tasks[i].Id}): {tasks[i].Status}");
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
Task.WaitAll(tasks);
|
||||
// Task.WaitAny(tasks);
|
||||
}
|
||||
catch (OperationCanceledException)
|
||||
{
|
||||
Console.WriteLine("Operation was 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}");
|
||||
}
|
||||
|
||||
Console.WriteLine("Program ended");
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user