2010-01-05 2 views
1

Je sais que les délégués Asycronous sont utilisés pour implémenter la fonctionnalité de rappel dans .NET.Est-il possible d'utiliser Callback à l'aide de ThreadPool? Puis-je utiliser autant de BackgroundWorkers que possible?

Je veux savoir

  1. Est-il possible d'utiliser à l'aide ThreadPool Callback? Puis-je utiliser autant de BackgroundWorkers que possible? Ce que je veux exactement savoir, est-ce qu'il y a un surcoût supplémentaire impliqué dans l'utilisation de BackgroundWorker au lieu de ThreadPool/AsyncDelegates/Thread Class? BackgroundWorker est implémenté en utilisant un délégué appelé de manière asynchrone.
+0

qu'est-ce que vous essayez de faire exactement? De votre question, il semble que vous confondiez plusieurs choses ... –

+0

Etes-vous en train d'écrire un projet WinForms? BackgroundWorker est uniquement destiné à exécuter une tâche d'arrière-plan dans WinForms. –

Répondre

1

En réponse à votre première question (si je comprends bien), la réponse est oui: Je pense que vous êtes à la recherche de la classe AsyncOperation, qui peut gérer des rapports d'étape et terminé les événements au thread appelant en utilisant son Post et PostOperationCompleted méthodes C'est ce que fait le BackgroundWorker sous le capot.

Voir: AsyncOperation Class

private AsyncOperation asyncOperation; 

public void DoSomethingAsync() 
{ 
    this.asyncOperation = AsyncOperationManager.CreateOperation(null); 
    ThreadPool.QueueUserWorkItem(s => this.DoSomethingImpl()); 
} 

private void DoSomethingImpl() 
{ 
    // report progress 
    this.asyncOperation.Post(new SendOrPostCallback(...), null); 

    // report complete 
    this.asyncOperation.PostOperationCompleted(new SendOrPostCallback(...), null); 
} 
0

La méthode cible du délégué invoqué de manière asynchrone est exécutée sur un thread à partir du pool de threads.

1

sont déjà fait Callbacks sur un fil de pool de threads, il est la valeur par défaut pour .NET. Faire un sur un fil que vous avez créé serait gênant. Le thread de travail pour un BackgroundWorker provient également du pool de threads.

Il n'y a pas de limite supérieure fondamentale au nombre de BGW que vous pouvez utiliser au-delà des ressources Windows disponibles. Le gestionnaire de pool de threads ne va cependant pas les laisser tous s'exécuter en même temps, il essaie de s'assurer qu'il n'y a jamais autant de threads actifs que de cœurs dans votre CPU. Ce n'est que lorsqu'un thread ne se termine pas dans un délai raisonnable qu'il autorise l'exécution de plusieurs threads, jusqu'à la limite définie par ThreadPool.SetMaxThreads(). Les chances que vous tirerez votre pied monte en quelque sorte quadratiquement avec le nombre de threads que vous avez créés.

Questions connexes