Реализация монитора прогресса в C#

В Eclipse я видел реализацию IProgressMonitor, которая впоследствии появилась и в SharpDevelop, но я не уверен, как это работает. Есть ли пример этого в другом месте, который может быть немного легче понять?

То, что я пытаюсь достичь, - это метод отслеживания хода выполнения множества задач (которые сильно различаются от 20 минут до 5 секунд) с помощью одной панели выполнения (задачи могут быть добавлены в любой момент времени).

Будет ли что-то подобное хорошей альтернативой/идеей?

interface ITask
{
    int TotalWork; // ProgressMax
    event Progresschanged; // Notifies of the current progress
    event ProgressComplete;
}

Затем «Монитор» просто использует шаблон «Наблюдатель» для отслеживания двух событий. Когда все индикаторы выполнения будут завершены, он скроет индикатор выполнения. Другая проблема заключается в том, что это отдельные потоки, которые создаются.

Может ли кто-нибудь посоветовать мне что-то или направить меня на правильный путь?


person Community    schedule 30.03.2009    source источник
comment
IProgressMonitor не является частью .net framework. Просматривая google, кажется, что это часть API eclipse... / пожимает плечами.   -  person Tony    schedule 30.03.2009
comment
Я обновил пример, который я дал, извините, я не видел вашего сообщения до сих пор: ‹a href=stackoverflow.com/questions/596991/c-multi-thread -паттерн/  -  person SwDevMan81    schedule 25.06.2009
comment
(задачи могут быть добавлены в любой момент времени) - так что это нормально, если ваш индикатор выполнения сжимается?   -  person dss539    schedule 25.06.2009


Ответы (2)


Ведите список задач и взвешивайте их по их общему вкладу;

struct Task { int work, progress  }
class OverallProgress
{
    List<Task> tasks;
    int Work { get { return tasks.Sum(t=>t.work; } }
    int Progress { get { return tasks.Sum(t=>t.progress/t.work); } }
    void AddTask(Task t) { tasks.Add(t); }
}

Эта реализация предназначена только для иллюстрации концепции.

Да, эта реализация неэффективна. Вы можете сохранить вычисленное значение Work, чтобы пересчитывать его только при добавлении новой задачи.

Да, вы можете потерять точность, выполнив целочисленное деление. Вам также придется подключить свои собственные события.

Если у вас возникли проблемы с этими задачами, сообщите об этом, и я или кто-то другой может предоставить полную реализацию такого класса.

person dss539    schedule 25.06.2009

System.Component.BackgroundWorker обрабатывает уведомление о ходе выполнения. Я бы создал несколько рабочих BG и заставил бы их отчитываться перед одним методом в потоке пользовательского интерфейса. Затем вы можете обновить индикатор выполнения.

person Adam Fyles    schedule 30.03.2009