на первый взгляд, если есть только некоторые незначительные моменты (не смотря на вашу архитектуру). мне кажется, что вы смешали несколько более новых и более старых конструкций. и есть некоторые части кода, которые не нужны.
например:
private static void ProcessB()
{
Task.WhenAll(Task.Run(() => DoSomething(1, "ProcessB"))).Wait();
}
с использованием метода Wait (), если какие-либо исключения случаются, они будут помещены в исключение System.AggregateException. на мой взгляд, так лучше:
private static async Task ProcessBAsync()
{
await Task.Run(() => DoSomething(1, "ProcessB"));
}
с использованием async-await, если возникает исключение, оператор await сбрасывает первое исключение, заключенное в исключение System.AggregateException. Это позволяет вам пытаться перехватить конкретные типы исключений и обрабатывать только те случаи, которые вы действительно можете обработать.
другая часть этой части кода:
private static void ProcessA()
{
var random = new Random();
var readBlock = new TransformBlock<int, int>(
x =>
{
try { return DoSomething(x, "readBlock"); }
catch (Exception e)
{
throw e;
}
},
new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = 1 }); //1
Зачем ловить исключение только для его отбрасывания? в этом случае try-catch является избыточным.
А вот это:
private static void SaveJoined(int x, int y)
{
Thread.Sleep(new TimeSpan(0, 0, 10));
Console.WriteLine("Save Joined!");
}
Гораздо лучше использовать await Task.Delay(....)
. Используя Task.Delay(...)
, ваше приложение не будет зависать.