2012-09-17 4 views
0

Существует несколько методов в классе, которые выполняют некоторую длительную операцию и должны периодически сообщать о ходе выполнения вызова вызывающему абоненту, например. отобразить на уровне представления, войдите в файл и т.д.Предпочтительный способ предоставления информации о ходе работы с помощью метода?

Я использовал следующие решения в прошлом, но я обеспокоен тем, что, если предпочтительный способ сделать это:

Я обратный вызов делегата определен как то:

public delegate bool ProgressCallback(double percentCompleted, object arg); 

Тогда мой метод «рабочий» как то:

public bool DoSomething(bool firstArg, int anotherArg, ProgressCallback progressCallback, object callbackArg); 

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

Обратите внимание, что процесс должен быть синхронным, нет необходимости в асинхронной реализации.

Я просто повторяю эту технику снова и снова в своем коде, поэтому я обеспокоен тем, является ли это рекомендуемым шаблоном. Разве это так, как вы реализуете такую ​​вещь? Должен ли я использовать события вместо этого, или такая простая реализация кажется вам подходящей?

ответ

1

Это правильный способ сделать это!

Но, чтобы спасти вас некоторое время (и код), вероятно, посмотрите на BackgroundWorker

+0

-1: «Обратите внимание, что процесс должен быть синхронным, нет необходимости в асинхронной реализации». – tomfanning

+0

Ах пропустил это, спасибо! Но (и я понимаю, что, если он этого захочет, достаточно оснований не делать этого), я бы предложил сделать это асинхронно. Кажется чистым, и вы можете сообщить о прогрессе более точно и лучше, ИМХО. –

+0

Ну, я использую BackgroundWorker в любом случае, но это реализовано в «верхнем слое», где асинхронная функциональность инкапсулирована. Этот конкретный класс сам по себе не обеспокоен этим. –

0

Я хотел бы использовать событие с флагом BOOL в аргументах события. Этот флаг bool может быть установлен потребителем и функционирует как ваш сигнал прерывания.

Смежные вопросы