2012-11-20 3 views
3

Как я могу исправить эту проблему?Фоновертор, не работает индикатор прогресса

Я ожидал прогрессбар для загрузки во время процесса недо процесса это делается

Вот мой код:

private void btnProcess_Click(object sender, EventArgs e) 
    { 
     backgroundWorker.WorkerReportsProgress = true; 
     backgroundWorker.ProgressChanged += backgroundWorker_ProgressChanged; 
     backgroundWorker.DoWork += backgroundWorker_DoWork; 

     backgroundWorker.RunWorkerAsync(); 
    } 

    private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e) 
    { 
     //start transaction 
     DoTransaction(); 
    } 

    private void backgroundWorker_ProgressChanged(object sender, ProgressChangedEventArgs e) 
    { 
     progressBar.Value = e.ProgressPercentage; 
    } 

Моя функция сделки:

private void DoTransaction() 
    { 
     string pathIdentifier; 
     pathIdentifier = func.checkthePathFile(); 
     if (pathIdentifier == null) 
     { 
      MessageBox.Show("Path has no yet been specified!"); 
     } 
     else 
     { 
      //create xml base from user inputs 
      XElement transactXML = new XElement("Transaction", 
       new XElement("CardNumber", txtCardNum.Text.Trim()), 
       new XElement("ExpireDate", txtExpDate.Text.Trim()), 
       new XElement("Cardtype", txtCardType.Text.Trim()) 
       ); 

      //save xml to a file 
      transactXML.Save(pathIdentifier + "/sample.xml"); 
     } 
    } 

ответ

3

Как среда выполнения предполагается узнать, насколько далеко продвинулся ваш процесс?

Вам необходимо сообщить об этом, позвонив по телефону backgroundWorker.ReportProgress с фона. Здесь нет волшебства.

MSDN: http://msdn.microsoft.com/en-us/library/ka89zff4.aspx

ломаются технологом на смысловые куски и ReportProgress всякий раз, когда это имеет смысл делать это.

public void DoTransaction() 
{ 
    part1(); 
    backgroundWorker.ReportProgress(25); 

    part2(); 
    backgroundWorker.ReportProgress(50); 

    part3(); 
    backgroundWorker.ReportProgress(75); 

    part4(); 
    backgroundWorker.ReportProgress(100); 
} 

Редактировать основании проводки сделки функции

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

Несколько вопросов:

Transaction() Ваш предоставляется метод пытается запустить MessageBox и читать Text свойства различных элементов управления из фонового потока. Это вызовет проблемы, поскольку среда выполнения обычно генерирует исключение, когда элементы пользовательского интерфейса получают доступ из потока, отличного от того, который их создал.

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

Кроме того, на мой взгляд, ваш метод Transaction не будет достаточно трудоемким, чтобы действительно гарантировать фоновый поток. Даже относительно старый ПК сможет создавать и сохранять файл с 15 элементами XML быстрее, чем вы можете моргнуть. Время выполнения, вероятно, будет тратить больше времени на сортировку данных между потоками, чем просто написать файл на диск. Просто выполните свою работу в обработчике событий нажатия кнопки.

+0

Спасибо, я обновил свой вопрос я ставлю то, что функция транзакции содержит, где я должен поставить это знать? Я просто поместил 4 данных в создание xml, но в реальных 15 данных.:) – GrayFullBuster

1

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

BackgroundWorker worker = sender as BackgroundWorker; 


затем называют как этот

`worker.ReportProgress(...)` 
+0

Спасибо, я обновил свой вопрос. Я поставил, какая функция транзакции содержит, где я должен ее знать? Я просто поместил 4 данных в создание xml, но в реальных 15 данных. :) – GrayFullBuster

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