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:

  1. 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é.
  2. 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:

  1. 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 🙂
  2. 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.
  3. Ont pas fait de test de fuite de mémoire à l'aide d'outils. Mais juste visual souci, voyez-vous des fuites?
  4. 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é.
  5. 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?

OriginalL'auteur Zenwalker | 2011-09-04