Considérez l'exemple de code suivant :
private void MyMethod() { Task task = MyAsyncMethod(); task.Wait(); } private async Task MyAsyncMethod() { //Code before await await MyOtherAsyncMethod(); //Code after await }
Dans cet exemple, lorsque le mot clé wait est rencontré dans MyAsyncMethod(), le contrôle revient à MyMethod(). Cependant, le thread n'est pas verrouillé à cause de task.Wait(). Au lieu de cela, la continuation (le code suivant wait) s'exécute sur un thread différent.
L'opérateur wait utilise un contexte de synchronisation, qui détermine comment la continuation doit être exécutée. Par défaut, si l'appelant s'exécute sur un thread d'interface utilisateur, la suite est également exécutée sur le thread d'interface utilisateur. Cela permet une intégration transparente avec les opérations de l'interface utilisateur.
Cependant, si l'appelant s'exécute sur un thread de pool de threads, la suite peut s'exécuter sur un thread de pool de threads différent. En effet, les threads du pool de threads ne sont pas destinés à être dédiés à des tâches spécifiques et peuvent être utilisés pour plusieurs opérations simultanément.
Il est important de noter que le comportement de l'opérateur wait peut être modifié à l'aide de la méthode ConfigureAwait. Cette méthode vous permet de spécifier si la suite doit s'exécuter sur le même thread ou sur un thread différent.
Par exemple, si vous ne souhaitez pas que la suite s'exécute sur le même thread et à la place sur un thread de pool de threads :
await task.ConfigureAwait(false);
En comprenant le fonctionnement des contextes de synchronisation, vous pouvez gérer efficacement l'exécution des threads dans du code asynchrone et éviter d'éventuels problèmes de verrouillage.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!