Je pensais que c'était essentiellement la même chose - écrire des programmes qui répartissent les tâches entre les processeurs (sur les machines qui ont 2+ processeurs). Alors je lis ceci , qui dit:
Les méthodes asynchrones sont destinées à être des opérations non bloquantes. Une expression d'attente dans une méthode async ne bloque pas le thread actuel pendant l'exécution de la tâche attendue. Au lieu de cela, l'expression signe le reste de la méthode en tant que continuation et renvoie le contrôle à l'appelant de la méthode async.
Les mots clés asynchrones et en attente n'entraînent pas la création de threads supplémentaires. Les méthodes asynchrones ne nécessitent pas de multithreading car une méthode asynchrone ne s'exécute pas sur son propre thread. La méthode s'exécute sur le contexte de synchronisation actuel et utilise l'heure sur le thread uniquement lorsque la méthode est active. Vous pouvez utiliser Task.Run pour déplacer le travail lié au processeur vers un thread d'arrière-plan, mais un thread d'arrière-plan n'aide pas avec un processus qui attend simplement que les résultats soient disponibles.
et je me demande si quelqu'un peut traduire cela en anglais pour moi. Il semble faire une distinction entre l'asyncronicité (est-ce un mot?) Et le threading et impliquer que vous pouvez avoir un programme qui a des tâches asynchrones mais pas de multithreading.
Maintenant, je comprends l'idée de tâches asynchrones comme l'exemple sur pg. 467 de C # In Depth de Jon Skeet , troisième édition
async void DisplayWebsiteLength ( object sender, EventArgs e )
{
label.Text = "Fetching ...";
using ( HttpClient client = new HttpClient() )
{
Task<string> task = client.GetStringAsync("http://csharpindepth.com");
string text = await task;
label.Text = text.Length.ToString();
}
}
Le async
mot-clé signifie " Cette fonction, chaque fois qu'elle est appelée, ne sera pas appelée dans un contexte dans lequel son achèvement est requis pour tout après son appel."
En d'autres termes, l'écrire au milieu d'une tâche
int x = 5;
DisplayWebsiteLength();
double y = Math.Pow((double)x,2000.0);
, car DisplayWebsiteLength()
n'a rien à voir avec x
ou y
, entraînera DisplayWebsiteLength()
l'exécution "en arrière-plan", comme
processor 1 | processor 2
-------------------------------------------------------------------
int x = 5; | DisplayWebsiteLength()
double y = Math.Pow((double)x,2000.0); |
Évidemment, c'est un exemple stupide, mais ai-je raison ou suis-je totalement confus ou quoi?
(En outre, je ne comprends pas pourquoi sender
et e
ne sont jamais utilisés dans le corps de la fonction ci-dessus.)
sender
et e
suggèrent qu'il s'agit en fait d'un gestionnaire d'événements - à peu près le seul endroit où cela async void
est souhaitable. Très probablement, cela s'appelle sur un clic de bouton ou quelque chose comme ça - le résultat étant que cette action se produit de manière complètement asynchrone par rapport au reste de l'application. Mais tout est toujours sur un thread - le thread d'interface utilisateur (avec un minuscule ruban de temps sur un thread IOCP qui publie le rappel sur le thread d'interface utilisateur).
DisplayWebsiteLength
exemple de code: vous ne devez pas utiliser HttpClient
dans une using
instruction - sous une charge élevée, le code peut épuiser le nombre de sockets disponibles, ce qui entraîne des erreurs SocketException. Plus d'informations sur l' instanciation incorrecte .