Warum dauert dieser C# Task so lange?

Was ist beim Mischen von synchronen mit asynchronen Tasks in C# das Problem, sodass der folgende Code extrem lange zur Ausführung benbötigt?

var sema = new SemaphoreSlim(1);

var tasks = new List<Task>();

for (int i = 0; i < 20; i++)
{
    var t2 = Task.Run(async () =>
    {
        var sw = new Stopwatch();
        sw.Start();
        await sema.WaitAsync().ConfigureAwait(false);
        try
        {
            await Task.Delay(1).ConfigureAwait(false);
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"sync {sw.Elapsed}");
    });

    var t1 = Task.Run(() =>
    {
        var sw = new Stopwatch();
        sw.Start();
        sema.Wait();
        try
        {
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"async {sw.Elapsed}");
    });

    tasks.Add(t1);
    tasks.Add(t2);
}

await Task.WhenAll(tasks).ConfigureAwait(false);

Ausgabe: es dauert 16 Sekunden!!! Nur die erste Ausgabe ist schnell, der Rest nach 16 Sekunden.

sync 00:00:00.8306484
sync 00:00:16.8401071
... Rest

Nehme ich beide male synchrone Tasks, geht es wesentlich schneller:

var sema = new SemaphoreSlim(1);

var tasks = new List<Task>();

for (int i = 0; i < 20; i++)
{
    var t2 = Task.Run(async () =>
    {
        var sw = new Stopwatch();
        sw.Start();
        await sema.WaitAsync().ConfigureAwait(false);
        try
        {
            await Task.Delay(1).ConfigureAwait(false);
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"sync {sw.Elapsed}");
    });

    var t1 = Task.Run(async () =>
    {
        var sw = new Stopwatch();
        sw.Start();
        await sema.WaitAsync().ConfigureAwait(false);
        try
        {
        }
        finally
        {
            sema.Release();
        }
        sw.Stop();
        Console.WriteLine($"async {sw.Elapsed}");
    });

    tasks.Add(t1);
    tasks.Add(t2);
}

await Task.WhenAll(tasks).ConfigureAwait(false);

Ausgabe: alles nach etwa 300ms fertig.

async 00:00:00.0180861
sync 00:00:00.3329542
...

Was passiert da im Hintergrund? Ich weiß, dass man snchrone mit asynchronen Tasks nicht mischen soll, aber die 16 Sekunden sind schon heftig und kommen fast einem Deadlock gleich. Was passiert nach 16 Sekunden, dass es dann plötzlich weitergeht ;-) ?

programmieren, C Sharp, Informatik
C#: Wie kann ich die binäre Suche am besten schreiben?

Hallo alle zusammen.

Ich habe eine Frage bezüglich dieses Quellcodes hier.

static void Main(string[] args)
{
  int[] Reihe = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; // Anlegen eines Arrays
  int max; // Bestimmung der Variablen
  int min;
  int mid;
  int Zahl;
  bool erfolgreich = false;
  
  min = 0;
  max = Reihe[9];

  foreach(int write in Reihe) // Ausgabe der vorhandenen Zahlen
  {
    Console.WriteLine(write);
  }

  Console.WriteLine("Geben Sie Ihre Zahl ein, damit wir überprüfen können, ob diese im System hinterlegt ist."); // Abfrage der gesuchten Zahl
  Zahl = Convert.ToInt32(Console.ReadLine());
  
  while (min <= max) // Mittelwert ermitteln
  {
    mid = (min + max) / 2;
    mid = Reihe[mid];

    if (mid < Zahl) // Wenn gesuchte Zahl größer als der Mittelwert, befindet sich der Wert in der rechten Hälfte
    {
      min = mid + 1;
    }

    if (mid > Zahl) // Wenn gesuchte Zahl kleiner als der Mittewert, befindet sich der Wert in der linken Hälfte
    {
      max = mid - 1;
    }

    if (mid == Zahl) // Wenn gesuchte Zahl gleich dem Mittelwert = Suche erfolgreich
    {
      erfolgreich = true;
      break;
    }
  }

  if (erfolgreich == true) // Ausgabe, ob die Zahl gefunden wurde oder nicht
  {
    Console.WriteLine("Ihre Zahl, die Sie eingegeben haben, ist im System hinterlegt.");
    Console.ReadLine();
  }
  else
  {
    Console.WriteLine("Ihre Zahl, die Sie eingegeben haben, ist NICHT im System hinterlegt.");
    Console.ReadLine();
  }

Und zwar möchte ich ein Programm schreiben, welches eine binäre Suche in einem Programm durchführt. Aber ich bekomme es nicht genau hin.

Die Funktion soll sein, dass, wenn ich das Programm starte eine Abfrage kommt, wo man dann eine gewünschte Zahl eingibt und danach Bescheid bekommt, ob diese in der Reihe vorhanden ist.

Wenn ich dort eine falsche Zahl eingebe, die nicht in der Reihe ist, kommt eine Fehlermeldung. Außerdem klappt das Programm wirklich nur, wenn im Array {1, 2, 3, 4, 5, 6, 7, 8, 9, 10 } steht. Aber hier hätte ich auch gerne andere Werte.

Danke im Voraus.

MfG

Computer, Schule, programmieren, Informatik
Hilfe bei Manifest?
Computer, IT, programmieren, JavaScript, Manifest, JSON

Meistgelesene Beiträge zum Thema Programmieren