Combien différente est l'attendent/asynchrone à partir de filetage?
Je suis en train de me familiariser avec le c#'s new attendent/async mots-clés, et j'ai trouvé plusieurs aspects dont je ne comprends pas très bien.
-
Commençons avec des conditions de course:
Stream s=... ... for(int i=0;i<100;i++) { s.WriteAsync(new byte[]{i},0,1); }
ce travail comme prévu tout le temps (par exemple, écrire dans le fichier 12345..... et pas 13254 ou quelque chose)?
La deuxième chose, c'est que async fonction s'exécute en mode synchrone si elle ne contient pas attendre de l'opérateur. Et, selon la documentation de microsoft, async fonctions de toujours exécuter dans le thread appelant (par rapport à BeginInvoke). Ce qui m'amène à 3 questions suivantes:
-
Combien de async fonction est exécutée avant qu'il libère à l'appelant de la fonction?
async void MyAsyncFunction() { Operation1(); Operation2(); Operation3(); .... Stream s=...; await s.WriteAsync(....); }
Dans les articles sur les attendent/async que j'ai lu, il est dit que async fonctions sans attendre l'opérateur d'exécuter séquentiellement, et avec async/await retour imminent. Mais c'est en me harcelant que
MyAsyncFunction
peut toujours exécuter Operation1...Operation3 avant de la relâcher dès qu'elle toucheawait s.WriteAsync
. -
Ce que si j'utilise
Thread.Sleep
dans l'asynchrone en fonction comme ceci:async void DoStuff() { Stream s=...; ... await s.WriteAsync(....); Thread.Sleep(10000); .... }
Sera Le Fil.Le sommeil de bloquer le thread entier dans lequel il est exécuté ou tout simplement de la fonction async?
-
Ce que si j'utilise
semaphore.Wait()
dans l'un des async fonctions et il va attendre pour le sémaphore à être libéré par une autre fonction async. Sera-ce de se comporter comme il le ferait avec les fils, ou que ça va provoquer un blocage? -
await
ne fonctionne pas en dehors de async fonctions. Pourquoi?
- Vous avez demandé trop de questions dans un post - it serait difficile d'y répondre de manière cohérente. Il semble que vous devriez vraiment faire un peu plus de recherche (il y a beaucoup d'informations sur Visual Studio Async page d'accueil, par exemple) et ensuite poser une question précise à un moment.
- Umm. async/await est threading. Juste une utilisation plus efficace des threads.
- voir msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx :
The async and await keywords don't cause additional threads to be created. Async methods don't require multithreading because an async method doesn't run on its own thread. The method runs on the current synchronization context and uses time on the thread only when the method is active.
- J'ai lu beaucoup de choses sur ce, et ce sont des questions je suis à gauche APRÈS la lecture de la documentation. Mais peut-être, je n'ai pas trouvé la bonne documentation, après tout. Pourriez-vous m'indiquer?
- Je viens de cité dans les commentaires ci-dessus
- Je voudrais commencer à msdn.microsoft.com/en-us/subscriptions/async.aspx
- Cette SI-question permet également de répondre à ceci: stackoverflow.com/questions/37419572/...
Vous devez vous connecter pour publier un commentaire.
Je vous recommande de lire mon
async
intro.Pas. Vous devez
await
les appels àWriteAsync
.Jusqu'à ce qu'il
await
s une opération qui n'est pas encore terminée.Thread.Sleep
- et toutes les autres méthodes de blocage - permet de bloquer laasync
méthode et le fil qui est de l'exécuter.En règle générale, ne pas utiliser de tout blocage des méthodes au sein d'une
async
méthode.Il dépend totalement de votre contextes.
Wait
est un blocage de la méthode, de sorte que si les "autres"async
méthode nécessite le contexte détenus par l'bloqué méthode, alors vous aurez un blocage.Noter que
SemaphoreSlim
estasync
-friendly; vous pouvez utiliserWaitAsync
au lieu deWait
.Parce que le
async
mot-clé permet à l'await
mot-clé. Cela a été fait pour minimiser l'impact de nouveaux mots-clés sur le langage C# et pour la lisibilité du code.Vous pouvez trouver réponse à vos questions sur
await
opérateur dans la suite de post par Eric Lippert, où il dit que:En bref, il semble que la réponse est "très". Tandis que le suivant ne peut pas répondre à toutes vos questions, je pense qu'elle s'applique à un général suffisamment de cas d'utilisation. Pensez à votre Flux à la place de l'e /s réseau ils parle.
http://social.msdn.microsoft.com/Forums/en-US/async/thread/a46c8a54-f8d4-4fa9-8746-64d6a3a7540d/