2010-09-01 8 views
0

* Note: reformuler ma question en fonction des commentaires de l'utilisateur.Besoin d'aide sur Backgroundworker

Besoin d'aide sur l'utilisation du thread Backgroundworker de .Net dans le but suivant d'augmenter la réactivité et les performances de l'interface utilisateur dans mon application Winforms .Net. Lorsque l'utilisateur clique sur le bouton « Calculer » sous forme d'interface utilisateur, je fais ceci:

1.Get une liste des catégories C de base de données [ceci est généralement autour de 10]

2.Pour chaque catégorie C, procédez comme suit:

a.Appelez une bibliothèque tierce, effectuez un traitement et calculez le prix de la catégorie.

b.Reconnaître une liste de produits [C'est typiquement autour de 800].

c.Pour chaque produit, calculez son prix en utilisant son prix de catégorie ci-dessus. D.Mettre à jour ce prix de chaque produit dans la base de données en utilisant un proc stocké. 3.Mettez à jour la progression [ou signalez un message d'erreur] à un formulaire dans l'interface utilisateur.

Pour info, je veux utiliser Backgroundworker pour les étapes #c et #d ci-dessus.

J'ai essayé d'utiliser Backgroundworker dans ma méthode. J'ai placé les appels à InitializeBackgroundworker() et RunWorkerAsync() dans la boucle la plus externe [ie. étape 2]. Mais on dirait, Backgroundworker est invoqué seulement pour la première catégorie. Qu'est-ce que je manque ici? Donc, ma question est, où puis-je appeler InitializeBackgroundworker() et RunWorkerAsync()? Et comment puis-je m'assurer que ces 2 méthodes sont appelées pour chaque catégorie?

Merci d'avoir lu.

+0

Je peux penser à plusieurs endroits à regarder - pouvez-vous poster le code de la boucle principale? – egrunin

Répondre

1

Essayez quelque chose comme ça pour commencer.

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... 
} 

Vous pouvez toujours le diviser en plusieurs BackgroundWorkers à mesure que votre compréhension augmente.