Tâche avec un événement de notification .net 4
Hier, j'ai vu un thread pour demander un code qui ce fait de cette façon. Je veux dire, vous (gestionnaire de thread) démarrer le nombre de tâches à l'aide de TPL Api et une fois qu'ils sont remplis de l'emploi, le thread doit vous informer (Gestionnaire) de dos qui maintient la Tâche de la piscine.
Voici donc le code que j'ai essayé. Même si je dois dire que ça fonctionne comme je le décris ci-dessus.
class TaskJob
{
public delegate void NotificationDelegate(int? taskId,string message);
public event NotificationDelegate NotifyCompletion;
public void TaskToRun()
{
try
{
if (Task.CurrentId == 4)//If its a 4th thread, simulate exception
throw new Exception();
Console.WriteLine("Task started with thread id " + Task.CurrentId);
Thread.Sleep(100000);
Console.WriteLine("Task finished with thread id " + Task.CurrentId);
NotifyCompletion(Task.CurrentId, "Successfully completed");
}
catch
{
NotifyCompletion(Task.CurrentId, "Faulted error");
}
}
}
class Program
{
static List<Task> taskList = new List<Task>();
public static void Main()
{
for (int i = 0; i < 5; i++)//starting 5 threads/tasks
{
TaskJob tb = new TaskJob();
tb.NotifyCompletion += new ConsoleApplication1.TaskJob.NotificationDelegate(tb_NotifyCompletion);
Task t = Task.Factory.StartNew(tb.TaskToRun);
taskList.Add(t);
}
Task.WaitAll(taskList.ToArray());
CheckAndDispose();
Console.ReadLine();
}
private static void CheckAndDispose()
{
foreach (var item in taskList)
{
Console.WriteLine("Status of task = " + item.Id + " is = " + item.Status);
item.Dispose();
}
}
static void tb_NotifyCompletion(int? taskId, string message)
{
Console.WriteLine("Task with id completed ="+ taskId + " with message = " + message);
}
}
Couple de heads up:
- Ne vous inquiétez pas de ne pas entretenir de Tâche[] plutôt que d'avoir une liste et puis de les convertir à la matrice. C'est juste un code. Non pas que je me concentre sur l'efficacité.
- Ne suis pas inquiet sur la coutume de Disposer de la mise en œuvre à partir de maintenant.
Maintenant, je me pose quelques questions, mais ne parviennent pas à me convaincre moi-même avec une réponse appropriée. Ici, ils sont:
- Est cette manière de résoudre le problème de la bonne? Ou est-il une meilleure façon de le faire? Le Code s'il vous plaît 🙂
- Comment s'assurer que les tâches les objets sont vraiment disposé (sur appel de la Jeter), mais pas la mise en œuvre de la coutume modèle dispose.
- Ont pas fait de test de fuite de mémoire à l'aide d'outils. Mais juste visual souci, voyez-vous des fuites?
- Dans la boucle for (méthode main) je suis entrain de créer TaskJob les objets de la classe qui sont à la boucle locale. Ainsi, ces objets est gc (permet de dire hors de portée) après la boucle d'achèvement. Alors, comment l'événement est déclenché dans le dos qui je suis accrochage à l'aide de cet objet, mais il a été éliminé après la boucle lorsque l'événement est déclenché.
- Toute autre chose que vous souhaitez ajouter?
Merci beaucoup 🙂
question hier n'était pas à propos de tâches TPL.
hein quoi? l'OP tâches sur les Tâches et la solution est de parler de ce que jon a répondu. Alors son sur le TPL.
lisez le dernier commentaire.
Et le genre de la raison pour downvote s'il vous plaît?
hein quoi? l'OP tâches sur les Tâches et la solution est de parler de ce que jon a répondu. Alors son sur le TPL.
lisez le dernier commentaire.
Et le genre de la raison pour downvote s'il vous plaît?
OriginalL'auteur Zenwalker | 2011-09-04
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas besoin de le faire vous-même à tout - utilisez des poursuites avec
Tâche.ContinueWith
ouTâche<T>.ContinueWith
. Que, fondamentalement vous permet de dire que faire quand une tâche est terminée - y compris l'exécution de code différent en cas d'échec, d'annulation et de succès.Il a également retourne une tâche, de sorte que vous pouvez ensuite continuer lorsque c'est terminé, etc.
Oh, et vous pouvez lui donner un
TaskScheduler
, de sorte qu'à partir d'un thread d'INTERFACE utilisateur que vous pouvez dire, "à l'issue de cette tâche terminée, exécuter le délégué sur le thread de l'INTERFACE utilisateur" ou des choses semblables.C'est l'approche que C# 5 méthodes asynchrones sont construits sur.
pourquoi ré-inventer la roue?
Pas exactement ré-inventer, plutôt remue de soi ou d'être curieux 🙂
Bien réinventer la même idée, je pense qu'il serait certainement préférable de l'utiliser le mécanisme existant directement plutôt qu'en l'enveloppant dans votre propre.
Il n'a jamais été un réel problème pour commencer.
OriginalL'auteur Jon Skeet
Sinon, vous pouvez essayer d'utiliser async /await modèle. Si vous attendez une Tâche qui signifie que le compilateur va générer automatiquement le ContinueWith pour vous.
Si vous utilisez ce modèle, vous pouvez écrire normale de méthodes asynchrones qui lui-même va générer de l'État de la machine.
Vérifier mon post
http://www.codeproject.com/KB/cs/async.aspx
Rx sur l'autre main peut représenter votre flux de données, je veux dire que vous pouvez brancher une séquence d'emplois et de s'abonner à votre observables sur un Observateur.
http://msdn.microsoft.com/en-us/data/gg577609
OriginalL'auteur abhishek