ProgressBar, который обновляется при загрузке словаря - PullRequest
0 голосов
/ 27 марта 2012

Ну, я думаю, что знаю ответ на этот вопрос, но я был бы признателен любому, кто подтвердил бы то, что я подозреваю.

У меня большой dictionary почтовый индекс, который необходимо загрузить при запуске программы. Это занимает 10-15 секунд, и я хотел бы получить progressbar, который мог бы показать прогресс. Я могу сделать индикатор выполнения, и у меня есть общее количество, указанное в качестве параметра. Но из того, что я нашел по другим вопросам, кажется, что dictionary.count нельзя привязать к индикатору выполнения, если есть надежда на его регулярное обновление.

Это правда? И если так, есть ли другой способ обойти это?

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

Изменить:

В соответствии с запросом, код, который загружает словарь zipCodes (на самом деле есть около 40 000 записей, но я решил сэкономить место: p):

static class ZipCodes
{
    #region Methods
    public static string GetValue(string key)
    {
        string result;
        if (zipCodeDictionary.TryGetValue(key, out result))
        {
            return result;
        }
        else
        {
            return null;
        }
    }

    public static int GetCount()
    {
        return zipCodeDictionary.Count();
    }
    #endregion


    #region ZipCode Dictionary Definition
    static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();

    public static void PopulateZipCodeDictionary()
    {
        zipCodeDictionary.Add( "00501", "Holtsville, NY" );
        zipCodeDictionary.Add( "00544", "Holtsville, NY" );
        zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
        zipCodeDictionary.Add( "00602", "Aguada, PR" );
        zipCodeDictionary.Add( "00603", "Aguadilla, PR" );
        zipCodeDictionary.Add( "00604", "Aguadilla, PR" );

Ответы [ 3 ]

2 голосов
/ 27 марта 2012

Самый простой способ - иметь неопределенный индикатор выполнения. Но если вы хотите показать связанный индикатор выполнения, вы можете реализовать INotifyPropertyChanged и иметь открытое свойство, которое также увеличивается с каждой операцией добавления, и иметь индикатор выполнения, привязанный к этому свойству.

static class ZipCodes: INotifyPropertyChanged
{
#region Methods
public static string GetValue(string key)
{
    string result;
    if (zipCodeDictionary.TryGetValue(key, out result))
    {
        return result;
    }
    else
    {
        return null;
    }
}

public static int GetCount()
{
    return zipCodeDictionary.Count();
}
#endregion

#region property
private static int progress=0;
Public static int LoadingProgress
{
    get
    {
    return progress;
    }
    set
    {
    if(value!=progress)
        {
            progress = value;
            NotifyPropertyChanged("LoadingProgress");
        }
    }
}   
#endregion

#region INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;
    private void NotifyPropertyChanged(String property)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
    }

#endregion


#region ZipCode Dictionary Definition
static Dictionary<string, string> zipCodeDictionary = new Dictionary<string, string>();

public static void PopulateZipCodeDictionary()
{
    zipCodeDictionary.Add( "00501", "Holtsville, NY" );
    LoadingProgress++;
    zipCodeDictionary.Add( "00544", "Holtsville, NY" );
    LoadingProgress++;
    zipCodeDictionary.Add( "00601", "Adjuntas, PR" );
    LoadingProgress++;
1 голос
/ 27 марта 2012

Вы можете использовать BackgroundWorker, если процесс загрузки действительно занимает много времени.Вот как это сделать

  1. Создать объект BackgroundWorker.

  2. Установить для его свойства WorkerReportsProgress значение True.

  3. Обработайте событие DoWork для загрузки словаря, периодически сообщая о прогрессе

    private void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
    {
        // Code to add entries to dictionary
        ...
    
        // Periodically, report progress using this call (in percentage)
        backgroundWorker.ReportProgress(percentProgress);
    }
    
  4. Обработайте событие ProgressChanged, чтобы обновить индикатор выполнения

    private void BackgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage;
    }
    
1 голос
/ 27 марта 2012

Вы можете создать свою собственную реализацию словаря, выведя из Dictionary<TKey, TValue>. Эта реализация может дополнительно реализовать интерфейс INotifyCollectionChanged и вызвать событие при вызове вашего переопределенного метода Add. Затем ваше приложение может прослушать это событие и соответствующим образом обновить индикатор выполнения.

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

...