und : unterschiedliche Verwendung der Nutzung und Ursache des Deadlocks await
Task.Result
Bei der Verarbeitung asynchroner Code ist es wichtig, den Unterschied zwischen
zu verstehen, um Ergebnisse zu erhalten. Verwirrung kann zu toten Schlössern führen, insbesondere bei APIs, die asynchrone Methoden implementieren. await
Task.Result
Betrachten Sie die folgende Testszene:
In diesem Test haben wir zuerst versucht,
<code class="language-csharp">[Test] public async void CheckStatusTwiceResultTest() { Assert.IsTrue(CheckStatus().Result); // 此处挂起 Assert.IsTrue(await CheckStatus()); }</code>
zu verwenden, um das Ergebnis zu erhalten. Diese Methode wird jedoch aufgehängt, da wir tatsächlich die Abschluss der Mission in der Synchronisation und Blockierung des Ausführungs -Threads durchführen. Task.Result
CheckStatus
Um zu verstehen, warum dies geschieht, müssen wir die
CheckStatus
<code class="language-csharp">private async Task<bool> CheckStatus() { // 进行 REST API 调用 IRestResponse<dummyservicestatus> response = await restResponse; return response.Data.SystemRunning; }</code>
await
Da die -Methode selbst asynchrone Operationen (Rest -API -Aufrufe) enthält, verursacht das Versuch durch Task.Result
synchrones Warten tote Schlösser. Der Hauptausführungs -Thread wartet auf die Ergebnisse des API -Aufrufs, und der API -Anruf wartet darauf, dass der Haupt -Thread weiter ausführt.
Die korrekte Methode zum Zugriff auf das Ergebnis der asynchronen Methode besteht darin, CheckStatus
Schlüsselwörter zu verwenden, wie im folgenden Test gezeigt: Task.Result
Hier verwenden wir await
, um den Ausführungs -Thread zu veröffentlichen, sodass API asynchron aufrufen kann. Führen Sie nach Abschluss des Betriebs die Wiederherstellung durch und erhalten Sie die Ergebnisse der Aufgabe, ohne tote Schlösser zu verursachen.
<code class="language-csharp">[Test] public async void CheckOnceAwaitTest() { Assert.IsTrue(await CheckStatus()); }</code>
Schlüsselwörter sollten verwendet werden, um Threads freizusetzen und solche Probleme zu vermeiden. await
Das obige ist der detaillierte Inhalt von`warte 'vs.` task.result`: Wann solltest du jeden verwenden und warum verursacht man Deadlocks?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!