с уведомлением о событии - .net 4

Вчера на Так, я видел, что поток просил код, который некоторые, что делает этот путь. Я имею в виду, вы (поток менеджера) запускаете количество задач с помощью API TPL и после того как они - завершенное задание, тот поток должен уведомить вас (менеджер) назад, который поддерживает пул Задачи.

, Таким образом, вот код, который я попробовал. Хотя я должен сказать, что это работает, как я описываю выше.

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);            
    }
}

Несколько голов:

  1. не волнуются о не поддержании Задачи [] вместо того, чтобы иметь список и затем преобразовать в массив. Его просто код. Не то, чтобы я концентрируюсь на эффективности.
  2. Am, не взволнованный на пользовательском, Располагают реализацию на данный момент.

Теперь я задаю мне несколько вопросов, но сбой для убеждения меня с подходящим ответом. Вот они:

  1. этот способ решить хорошую проблему? Или есть ли лучший способ сделать это? Код :)
  2. , Как удостовериться, что объекты задач действительно расположены (по вызову Располагают), но не реализация пользовательского Располагает образец.
  3. не сделали никаких тестовых инструментов использования утечки памяти. Но просто визуальная польза, вы видите утечки?
  4. В для цикла (основной метод) я создаю объекты класса TaskJob, которые локальны для цикличного выполнения. Таким образом эти объекты добираются, gc'd (позволяет, говорят из объема) после завершения цикла. Так, как событие ведется ответный огонь, который я - присоединение с помощью этого объекта, но это было расположено после цикла, когда на самом деле событие запущено.
  5. Какая-либо вещь еще вы хотите добавить?

Большое спасибо :)

5
задан Zenwalker 4 September 2011 в 05:26
поделиться