what - unterschied task thread c#




Müssen Sie die Verwendung von SemaphoreSlim verstehen (2)

Hier ist der Code, den ich habe, aber ich verstehe nicht, was SemaphoreSlim macht.

async Task WorkerMainAsync()
{
  SemaphoreSlim ss = new SemaphoreSlim(10);
  List<Task> trackedTasks = new List<Task>();
  while (DoMore())
  {
    await ss.WaitAsync();
    trackedTasks.Add(Task.Run(() =>
              {
                DoPollingThenWorkAsync();
                ss.Release();
              }));
  }
  await Task.WhenAll(trackedTasks);
}

void DoPollingThenWorkAsync()
{
  var msg = Poll();
  if (msg != null)
  {
    Thread.Sleep(2000); // process the long running CPU-bound job
  }
}

Was erwartet ss.WaitAsync(); & ss.Release(); ss.WaitAsync(); & ss.Release(); tun?

Ich denke, wenn ich 50 Threads gleichzeitig ausführte, schreibe Code wie SemaphoreSlim ss = new SemaphoreSlim(10); Dann wird es gezwungen, zur Zeit 10 aktiven Thread auszuführen.

Wenn einer von 10 Threads abgeschlossen ist, wird ein anderer Thread gestartet. Wenn ich nicht Recht habe, dann helfen Sie mir, mit der Beispielsituation zu verstehen.

Warum muss ss.WaitAsync(); zusammen mit ss.WaitAsync(); verwendet werden ss.WaitAsync(); ? Was macht ss.WaitAsync(); tun?


Ich denke, wenn ich 50 Threads auf einmal laufe, dann Code wie SemaphoreSlim SS = New SemaphoreSlim (10); wird zwingen, zur Zeit 10 aktive Threads auszuführen

Das ist richtig; Die Verwendung des Semaphors stellt sicher, dass nicht mehr als 10 Mitarbeiter gleichzeitig diese Arbeit ausführen.

WaitAsync Sie WaitAsync für das Semaphor WaitAsync , wird eine Task erstellt, die abgeschlossen ist, wenn der Thread "Zugriff" auf das Token erhalten hat. await Warten auf diese Task wird die Ausführung des Programms fortgesetzt, wenn dies "erlaubt" ist. Eine asynchrone Version zu haben, anstatt Wait aufzurufen, ist wichtig, um sicherzustellen, dass die Methode asynchron bleibt, anstatt synchron zu sein. Wait wird darauf geachtet, dass eine asynchrone Methode aufgrund der Rückrufe Code über mehrere Threads hinweg ausführen kann. und so kann die natürliche Fadenaffinität zu Semaphoren ein Problem sein.

Eine Randnotiz: DoPollingThenWorkAsync sollte das Async Postfix nicht enthalten, da es nicht asynchron, sondern synchron ist. Nennen Sie es DoPollingThenWork . Dies verringert die Verwirrung für die Leser.


Obwohl ich akzeptiere, dass sich diese Frage wirklich auf ein Countdown-Sperrszenario bezieht, hielt ich es für sinnvoll, diesen Link zu teilen, den ich für diejenigen entdeckt habe, die ein SemaphoreSlim als einfache asynchrone Sperre verwenden möchten. Sie können die using-Anweisung verwenden, um die Codierung übersichtlicher und sicherer zu machen.

http://www.tomdupont.net/2016/03/how-to-release-semaphore-with-using.html

Ich habe _isDisposed=true und _semaphore.Release() um seine Dispose _semaphore.Release() wenn es irgendwie mehrfach aufgerufen wurde.





semaphore