2009-09-23 4 views
3

Comme je peux effectuer des opérations asynchrones en utilisant des délégués, je soupçonne qu'il y a une petite chance d'utiliser System.Threading dans mon application. Y at-il une situation essentielle où je ne peux pas éviter System.Threading?C# - Alors que les délégués effectuent la tâche Asyn, ai-je besoin de System.Threading?

(Juste je suis en phase d'apprentissage).

Exemple:

class Program 

{ 

public delegate int Total (int a,int b); 

static void Main() 

{ 

    Total tl = new Total(SumUp); 
    IAsyncResult isany=tl.BeginInvoke(20,20, null, null); 

    while (!isany.IsCompleted) 
    { 
     Console.WriteLine("Busy with other work"); 
    } 

    int ans = tl.EndInvoke(isany); 

    Console.WriteLine("Result ={0}", ans); 

} 

static int SumUp(int a,int b) 

{ 
    a = a * a; 

    b = b * b; 

    return a + b; 

} 
} 

Répondre

8

Nous obtenons constamment de meilleures abstractions qui traitent de la concurrence, de sorte que les constructions de plus bas niveau ne sont souvent pas nécessaires.

Vous avez déjà trouvé un exemple d'une telle abstraction de plus haut niveau, et .NET 4.0 nous donnera des moyens nouveaux et très puissants de traiter le code concurrent, tels que Tâches et continuations. Au fur et à mesure que le temps passe, vous devriez être capable de faire face à la simultanéité à des niveaux d'abstraction de plus en plus élevés. Si ces abstractions vivent dans System.Threading ou non est, à mon avis, moins important.

+0

Marquer, asynchrone Les délégués se rapportent à l'enfilage ou à la simultanéité? Je suis confus par certaines réponses ici http://stackoverflow.com/q/10533971/328397 – LamonteCristo

-1

-je encore besoin System.Threading

Que voulez-vous dire par "besoin"? Les types de System.threading sont définis dans l'assembly mscorlib qui est toujours chargé. Vous avez seulement besoin de dire using System.Threading si vous voulez éviter les noms entièrement qualifiés dans votre code.

2

Les délégués asynchrones s'exécutent sur le thread pool, comme détaillé here. Une situation que j'ai dû utiliser un thread explicite consistait à exécuter une tâche d'interface utilisateur en arrière-plan, car les threads du pool d'unités d'exécution sont tous multithread, et les tâches d'interface utilisateur ne peuvent être exécutées que dans un seul. Le lien ci-dessus donne également quelques autres situations où il n'est pas approprié d'utiliser le pool de threads.

Bien que la plupart des tâches d'arrière-plan de courte durée doivent être effectuées à l'aide du pool de threads ou des délégués asynchrones, vous devrez créer un thread explicite dans certaines situations. System.Threading ne partira pas bientôt.

+0

thecoop a raison. . . Impliqué par sa réponse est que les threads de pool de threads sont une ressource limitée. Un bon exercice pour vous serait d'écrire un petit paquet qui simule la fonctionnalité Begin/EndInvoke sur les threads non-threadpool. Vous pouvez implémenter IAsyncResult, des méthodes génériques, des rappels et d'autres goodies pour compléter ce paquet. – TheEruditeTroglodyte

Questions connexes