2016-05-26 3 views
0

Je suis nouveau en C# et maintenant j'essaye d'apprendre async et d'attendre en trouvant mon propre exemple. Mais j'ai de la difficulté à l'appliquer. Fondamentalement, je volé cet exemple de MSDN: https://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.110).aspxRemplir la liste séparément en utilisant async et attendre

Mais dans la méthode principale, au lieu de ce qui est là, je mets:

static void Main(string[] args) 
    { 

     Person[] pArray = new Person[100]; 

     //populate first 50 people 
      //TODO: USE ASYNC 
     //populate last 50 people 
      //TODO: USE ASYNC 
     //await here 
     People peopleList = new People(pArray); 

     //do some linq 
     Console.ReadKey(); 

    } 

Je ne sais pas vraiment comment mettre en œuvre la partie TODO (je suis Je ne sais pas si c'est comme ça que vous le faites). Dois-je créer une méthode de tâche parallèle à main? Mais le pArray ne sera pas global de cette façon et la fonction de tâche ne devrait pas pouvoir modifier la variable, non? Je me demandais comment vous pourriez mettre en œuvre cela. Tous les conseils seront appréciés!

Merci!

+2

J'ai peur que ce n'est pas une bonne approche pour apprendre à utiliser 'await' (ou plus généralement, concurrency/asynchronny/parallelism). Tout d'abord, vous voulez éviter tout état partagé (dans ce cas, 'pArray') - à la place, vous devriez idéalement faire en sorte que chacune des méthodes asynchrones renvoient leurs propres parties des données, et vous les regrouperiez simplement sur le fil principal. Deuxièmement, vous devez vous assurer que 'await' a un endroit où retourner - dans votre code,' Main' s'arrêtera tout simplement et tue tout dès que vous frapperez le premier 'await'. Essayez www.albahari.com/threading/ pour un primer :) – Luaan

+0

Je peux me tromper, mais le tableau n'est pas thread-safe .. Donc vous devriez commencer par la collection thread-safe en premier. Ensuite, vous pouvez continuer à le remplir par des fils comme vous le souhaitez. Ou dans chaque thread, utilisez l'instance de sauvegarde de l'objet pour VERROUILLER le pArray lors de manipulations. Sinon, le monde multithread mortel ne vous mettrait pas à merci. ;) * fil de sécurité: collections https://msdn.microsoft.com/en-us/library/dd997305(v=vs.110).aspx Comment verrouiller: https://msdn.microsoft .com/fr-fr/library/c5kehkcz.aspx – Anatolyevich

+0

@Luaan que faire si je le change en pArray1 et et pArray2, 50 longueur chacun? Je veux qu'ils peuplent en même temps si tard, je pourrais être en mesure d'attendre et faire un peu de linq sur ces deux tableaux? –

Répondre

1

Il est beaucoup plus facile d'apprendre async/await si vous commencez par effectuer des opérations liées aux E/S asynchrones. Le simple fait de créer People et de les ajouter à un tableau est lié au processeur et non lié aux E/S. Pour async, vous voulez commencer avec E/S. Par exemple, vous pouvez télécharger la page d'accueil de Google:

var client = new HttpClient(); 
var result = await client.GetStringAsync("http://www.google.com/"); 

De plus, l'apprentissage await est plus facile avec une application de l'interface utilisateur plutôt que d'une application console. Alors collez le code ci-dessus dans un événement de clic sur un bouton et voyez ce qui se passe.