2017-08-28 1 views
0

Je suis novice en multithreading et j'ai une question (probablement) simple sur l'utilisation simultanée de threads et de wait/async. J'ai une méthode qui lit un flux TCP, puis traite la réponse reçue. Il est appelé d'une manière montré ci-dessous:Est-il viable d'utiliser simultanément wait/async et threads sur une méthode?

ThreadStart ts = new ThreadStart(ReadTCP); 
Thread tt = new Thread(ts); 

Est-il viable de lire les données du flux de façon asynchrone? Comme dans ce code:

private async void ReadTCP() 
    { 
     string responseData = string.Empty; 

     if(streamTCP.DataAvailable) 
     { 
      responseData = await readerTCP.ReadToEndAsync(); 

      // some code handling the response 
     } 
    } 

code édité avec MarioDS's help

+0

Je ne pense pas que votre streamTCP soit thread-safe. Ce code échouera d'une manière ou d'une autre. –

+0

Je ne l'ai pas encore verrouillé, mais je sais comment le faire. –

+2

Le verrouillage peut simplement annuler tout thread que vous essayez de faire. –

Répondre

2

Création manuelle et la manipulation de threads est une technique de multithreading avancée qui nécessite un développeur de vraiment savoir quel (s) il fait (parce que la clôture de la mémoire, la synchronisation et le marshalling entre les discussions sont tous des sujets sérieusement avancés et faciles à gâcher). Thread-sécurité est difficile.

Si tout ce que vous voulez, c'est améliorer la réactivité de votre application, les constructions asynchrones et d'attente qui ont été ajoutées à .NET il y a quelques années sont parfaites. Ils ne sont pas nécessairement liés au multithreading, car c'est le mécanisme sous-jacent qui décide si de nouveaux threads sont créés (et ce n'est pas toujours le cas).

Ce que vous faites est de créer un thread et d'exécuter la méthode ReadTCP sur ce thread.

Vous pouvez aussi facilement fixer ReadTCP il retourne Task (async void est vraiment mauvaise pratique!), Puis l'utiliser comme ceci: var response = await ReadTCP(); dans une méthode async et il vous donnera ce que vous voulez.

Pour exécuter des choses en parallèle tout en exécutant ReadTCP, créez une variable pour la tâche et await plus tard:

var readTask = ReadTCP(); 
DoOtherStuff(); 
AndMoreStuff(); 
AllAtOnce(); 
var response = await readTask; 
DoSomethingWith(response); 

Par ailleurs, vous n'avez pas à envelopper les méthodes de Async Task.Run. Au lieu de faire: Task.Run(() => FPXreaderTCP.ReadToEndAsync());, faites simplement await FPXreaderTCP.ReadToEndAsync().

+0

Je n'ai pas besoin de stocker la réponse après la fin de la méthode. Il fait des choses avec, comme écrire dans une base de données - cette partie est déjà multithread sûr. –

+0

@FilipS encore, faites-lui retourner 'Task' (l'équivalent asynchrone de' void' en termes simples) et 'l'attendre 'à un point approprié dans votre code. – MarioDS