2012-03-27 2 views
0

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

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

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

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

Edit:

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

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"); 
+0

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

+4

Мне было бы любопытно посмотреть, что код, который вы используете для загрузки почтовых индексов. Не имеет смысла, что это займет 10-15 секунд. Если бы я был вами, я бы посмотрел на это, прежде чем пытаться реализовать индикатор выполнения. –

+1

вместо загрузки его в словарь, вы должны рассмотреть его загрузки в DataTable или что-то другое. обычно zip-коды будут храниться в таблице базы данных и запрашиваться с использованием sql. он, вероятно, загрузит все в памяти быстрее, чем все, что вы делаете. – Timmerz

ответ

1

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

  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

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

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

2

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

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++; 
+0

Некоторое время я сделал использовать неопределенную ProgressBar, в сочетании с фоном рабочего. Просто завершил переход к файлу базы данных MS Access, хотя, поэтому никаких проблем больше нет. –

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