Нужна помощь на Backgroundworker - PullRequest
       3

Нужна помощь на Backgroundworker

0 голосов
/ 01 сентября 2010

* Примечание: Перефразируя мой вопрос, основываясь на комментариях пользователя.

Нужна помощь в том, как использовать поток .Net Backgroundworker для следующих целей, чтобы повысить отзывчивость и производительность пользовательского интерфейса в моем приложении .Net winforms.Когда пользователь нажимает кнопку «Рассчитать» в форме пользовательского интерфейса, я делаю это:

1.Получить список категорий C из базы данных [обычно это около 10]

2.Для каждогокатегория C, выполните следующие действия:

a.Звоните в стороннюю библиотеку, выполните некоторую обработку и рассчитайте цену категории.

b.Получите список продуктов [Обычно это около 800].

c. Для каждого продукта рассчитайте его цену, используя цену из категории, указанной выше.

d. Обновите эту цену каждого продукта в базе данных, используя сохраненный процесс.

3. Обновите ход выполнения [или сообщите любое сообщение об ошибке] в форму в пользовательском интерфейсе.

К вашему сведению, я хочу использовать Backgroundworker для шагов #c и #d выше.

Я пытался использовать Backgroundworker в своем методе. Я помещал вызовы InitializeBackgroundworker () и RunWorkerAsync () в самый внешний цикл [т.е.шаг 2]. Но похоже, что Backgroundworker вызывается только для первой категории. Чего мне здесь не хватает?

Итак, мой вопрос: где мне сделать вызов InitializeBackgroundworker () и RunWorkerAsync ()?И как мне сделать так, чтобы эти 2 метода вызывались для каждой категории?

Спасибо за чтение.

Ответы [ 2 ]

1 голос
/ 02 сентября 2010

Попробуйте что-то подобное для начала.

BackgroundWorker worker = new BackgroundWorker();

void SomeForm_Load(object sender, EventArgs e)
{
  // setup the BackgroundWorker 
  worker.WorkerReportsProgress = true;
  worker.DoWork += new DoWorkEventHandler(worker_DoWork);
  worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
  worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_Completed);
}

void SomeControl_Click(object sender, EventArgs e)
  List<Category> categories = DataBase.GetSomeCategories(); // [1] get Category list
  // start the BackgroundWorker passing in the categories list.
  worker.RunWorkerAsync(categories);
}

void worker_DoWork(object sender, DoWorkEventArgs e)
{
  int progress = 0;
  var categories = e.Argument as List<Category>;       
  categories.ForEach(category =>                         // [2] process each Category
  {
    ThirdPartyControl.DoSomeProcessing(category);        // [2.a]
    var categoryPrice = CalculateCategoryPrice(category);
    var products = GetListOfProducts(category);          // [2.b] 
    products.ForEach(product =>                          // [2.c] process each Product
    {          
      var productPrice = CalcProductPrice(categoryPrice); 
      DataBase.UpdateProduct(product, productPrice);     // [2.d]
      progress = //...calculate progress...
      worker.ReportProgress(progress);                   // [3]
    });
    progress = //...calculate progress...
    worker.ReportProgress(progress);                     // [3]
  });
  worker.ReportProgress(100);
}

void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
  //...update some UI stuff...
  progressBar.Value = e.ProgressPercentage;
}

void worker_Completed(object sender, RunWorkerCompletedEventArgs e)
{
  //...all done...
}

Вы всегда можете разбить его на несколько BackgroundWorkers, когда ваше понимание увеличивается.

1 голос
/ 01 сентября 2010
...