Asynchrone délégués vs Threads
Remplacement de Threads (pas de pool de threads Thread) avec Asynchrone Délégués (Rappels).
Mon Scénario: Spawn un Thread/del.beginInvoke() par Client.
Selon moi,
Raisons
- besoin pour la Notification, par Rappel /Appel délégué à nouveau dans le Rappel
- Éviter Fil les frais Généraux, les délégués utilisation de pool de threads thread)
- Passer des Arguments (Éviter de jeter de l'objet) et ont besoin de la valeur de retour de la méthode.
Corrigez-moi si les raisons ci-dessus sont fausses.
- Est toute autre raison?
- Ce scénario que j'avais exactement besoin de faire quelques trucs avec Asynchrone Délégués qui
les threads ne peuvent pas?
3.La Performance ?
Exemple
public delegate void SendCallbackType();
SendCallbackType senderdel= new SendCallbackType(SendData);
public void StartSend() //This method Could be Called more than 700 times (Thread per Client)
{
senderdel.BeginInvoke(SendCallback,null);
//(or)
Thread t = new Thread(new ThreadStart(ThreadSend));
t.IsBackground = true;
t.Start();
}
//Async Delegate
void SendData()
{
string data = QueData.DeQueue();
RaiseOnData(data); //Raise to event.
}
void SendCallback(IAsyncResult ar)
{
senderdel.BeginInvoke(SendCallback, null);
}
//Thread
void ThreadSend()
{
while (true)
{
string data = QueData.DeQueue();
RaiseOnData(data); //Raise to event.
}
}
À partir du dessus de l'option qui serait la meilleure. La Performance ?
OriginalL'auteur C-va | 2012-07-13
Vous devez vous connecter pour publier un commentaire.
Votre raisonnement est correct. Async délégués utilisation de threads du pool de threads de sorte qu'ils devraient être plus rapide par rapport au manuel de création de thread. Attention tout de même avec cette ASP.NET des applications. Parce que vous serez manger des threads qui sont normalement utilisés par les ASP.NET pour les demandes de service et votre application peut très rapidement de capacités d'entretien.
Async les délégués sont très bien pour les tâches gourmandes en CPU. Pour les e/S intensives des tâches (telles que la lecture, les ruisseaux, les appels de base de données et les appels de service web), vous devez utiliser le BeginXXX, EndXXX méthodes proposées directement par les classes correspondantes (Stream, SqlConnection, WebClient, ...). De cette façon, vous n'êtes pas en utilisant des filets à tous les cours de la longue opération d'e/S. Vous utilisez I/O Ports De Fin D' qui est la meilleure chose en termes d'I/O des tâches limitées. Il sera ordres de grandeur plus performant et de ressources bon marché que tous les threads et les pools de threads.
Donc, pour résumer:
Et si vous n'avez pas .NET 4.0 utilisation du pool de threads à moins que vous écrivez un ASP.NET application dans ce cas, vous pourriez recourir à manuel de création de thread.
En général, il est de bonne pratique pour commencer à utiliser TPL et d'orienter vos méthodes les tâches de sorte que vous êtes prêt pour .NET 4.5, qui présente le async/await mots-clés.
certainement aller avec TPL dans ce cas, et si vous utilisez une ancienne version de .NET use le thread du pool (pool de threads, BackgroundWorker, Async délégués, ... => ils finiront tous dans le pool de threads de toute façon). Ne fraie pas threads manuellement dans cette situation.
Darin: Et je n'ai pas besoin d'Incendie et d'oublier. Ici, je suis dans le besoin d'un thread dédié à dequeue (indépendamment de pool de threads) et en même temps, c'est long processus en cours d'exécution.
Tu parles du producteur/consommateur?
Ouais, bien sûr (Il est appliqué dans la file d'attente de la file d'attente)
OriginalL'auteur Darin Dimitrov