Ich lese hier:Ist es sicher, lock() mit Tasks zu verwenden?
.NET async, can a single thread time-slice between tasks?
, dass, wenn Sie nicht ausdrücklich verwenden async/await, Aufgaben nicht "Zeitscheibe" auf dem gleichen Thread im Backend-Thread-Pool. Ist das garantiert? Oder nur ein Nebeneffekt der aktuellen Implementierung der TPL?
Wenn nicht garantiert, wäre es Problemen mit lock()
mit:
Betrachten wir zwei Aufgaben, die ein Verfahren zuzugreifen, die locks
auf eine vollständige Transaktion Serialport (eine Nachricht senden und empfangen, oder Timeout) vor der Freigabe. Wenn Time-Slicing im selben Thread auftritt und der SerialPort-Zugriff langsam genug ist, würde die lock
ihre Arbeit nicht ausführen (indem sie beide Aufrufe durchlässt, da sie sich technisch im selben Thread befinden).
Da Sie normalerweise nicht um externe Anrufe "sperren", was auch immer Verhalten dort ist, sollte kein Problem für echten Code sein ... –
Ja, es ist garantiert, weil der Task-Scheduler (auch benutzerdefinierte) auf eine bestimmte Task-Ausführung warten wird Rendite oder Rendite. Sie können physisch nicht zwei Codebereiche gleichzeitig im selben Thread ausführen, ohne dass der Task dem Scheduler zugewiesen wird. –
Beachten Sie, dass es sich bei dieser Frage um rohen TPL-Code handelt, da dieser nicht auf 'async' /' await'-Code zutrifft - Sie können '' '' '' '' nicht erwarten, da Sie einen Fehler bekommen im Körper einer Lock-Anweisung "versucht, es zu tun. –