Является ли это хорошей практикой для отображения процесса обработки данных в библиотеке классов? - PullRequest
3 голосов
/ 01 июля 2011

Я разработал библиотеку классов C #, некоторые из их методов отображают информацию о ходе ее обработки, потому что они читают и пишут миллионы записей, а пользователь спрашивает, как узнать, как идет процесс, и сколько времени ему ждать.

Использование внедрения зависимостей, чтобы избежать «если прогресс консоли приложения записывается в консоль, иначе, если индикатор выполнения приложения WPF», (1) Я получил отображение на консоли времени для каждого миллиона обработанных записей, если метод вызываетсяиз консольного приложения и (2) я получил отображение индикатора выполнения в графическом интерфейсе, если метод вызывается из приложения WPF.

Вопрос здесь в том, является ли это хорошей практикой того, что я делаю, или, есть ли лучшая / правильная альтернатива этому вопросу?

Мои наилучшие пожелания.

Ответы [ 3 ]

8 голосов
/ 01 июля 2011

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

Ваше решение звучит так, как будто оно может работать, если у вас есть окно консоли или приложение WPF, но что, если оно вызывается с веб-сайта или из службы?Я видел, как многие службы отключались из-за того, что какая-то мошенническая библиотека классов пыталась отобразить диалоговое окно, но не было никого, кто мог бы нажать кнопку ОК.

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

Посмотрите, как работает класс BackgroundWorker для хорошей модели этого: http://msdn.microsoft.com/en-us/library/8xs8549b.aspx

5 голосов
/ 01 июля 2011

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

Какой уровень контроля вы хотите передать (например, сообщать мне о каждом элементе или каждом N элементах) - это вопрос, который вы должны решить для себя, но обработчик должен быть довольно легким в работе. такого рода вещи для себя.

1 голос
/ 01 июля 2011

Вот пример вызова событий, этот код будет идти в вашем классе, который выполняет работу в фоновом потоке. MessageEventsArgs является производным от EventArgs (MessageEventArgs: EventArgs), поэтому пользовательская информация может быть передана вызывающей стороне. Это не обязательно, можно использовать EventArgs e.

public delegate void SchemaProcessorMessageEventHandler(object sender, MessageEventArgs e);
public event SchemaProcessorMessageEventHandler SchemaProcessorMessage;


protected virtual void OnSchemaProcessorMessage(MessageEventArgs e)
{
    if (SchemaProcessorMessage != null)
    {
        SchemaProcessorMessage(this, e);
    }
}

Теперь в вашем вызывающем (UI) настройте прослушиватель событий. Удалите прослушиватель событий - = когда закончите.

_SchemaProcessor = new ServerSchemaUtilityFramework.SchemaProcessor();
_SchemaProcessor.SchemaProcessorMessage += new ServerSchemaUtilityFramework.SchemaProcessor.SchemaProcessorMessageEventHandler(sp_SchemaProcessorMessage);

void sp_SchemaProcessorMessage(object sender, ServerSchemaUtilityFramework.MessageEventArgs e)
{
    //Update the UI, if on background will need to (!this.Dispatcher.CheckAccess())     
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...