Bonjour.
Je développe actuellement une application afin de m'aider dans mes tâches quotidiennes, et je rencontre un soucis concernant les progressbar en conjonction avec un backgroundworker.
Mon interface est faite en WPF.
Pour faciliter, voilà ce dont je dispose : une classe contenant les différentes actions des boutons (le main thread), ainsi que d'une autre classe contenant mes requêtes wmi.
Donc, voilà ce que j'essaie de faire.
Code de la main window, avec les actions des boutons :
Et la classe contenant mes requêtes wmi ressemble a ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 namespace MyApp { public partial class MainWindow : MetroWindow { BackgroundWorker bgw = new BackgroundWorker(); public MainWindow() { InitializeComponent(); } private void BtnProcesse_Click(object sender, RoutedEventArgs e) { String hostname = tb_hostname.Text; bgw.DoWork += new DoWorkEventHandler(Wmi_Requests.getProcesses(hostname)); // Ne fonctionne pas bgw.ProgressChanged += new ProgressChangedEventHandler(bgw_ProgressChanged); bgw.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bgw_RunWorkerCompleted); bgw.WorkerReportsProgress = true; bgw.RunWorkerAsync(hostname); } void bgw_DoWork(object sender, DoWorkEventArgs e) { // Job à effectuer } void bgw_ProgressChanged(object sender, ProgressChangedEventArgs e) { Progressbar1.Value = e.ProgressPercentage; } void bgw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) { // Terminé } } }
Donc pour résumer, lorsque j'appuie sur le bouton "btn_processe", ça call la méthode "getProcesses" de la class "Wmi_Requests". Etant donné que certaines requêtes peuvent être longues, et afin de ne pas freezer l'interface, j'ai opté pour les background worker + progressbar pour avoir un état d'avancement. Mais je n'y arrive pas :'(
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 class Wmi_Requests { private readonly MainWindow Form; public Wmi_Requests(MainWindow Form) { this.Form = Form; } public void getProcesses(string hostname) { ManagementScope scope = new ManagementScope("\\\\" + hostname + "\\root\\cimv2"); scope.Connect(); ObjectQuery query = new ObjectQuery("SELECT * FROM Win32_Process"); ManagementObjectSearcher searcher = new ManagementObjectSearcher(scope, query); foreach (ManagementObject product in searcher.Get()) { // Pour cet exemple, sortie vers la console Object Name = product["Name"].ToString(); Object Version = product["ProcessId"].ToString(); Console.WriteLine(Name + " --- " + Version); } } } }
Enfin, il faut tenir compte du fait que biensur je n'aurai pas qu'un seul bouton, et que plusieurs actions seront possible. Après je ne sais pas si dans ce cas, il est mieux d'instancier des nouveaux backgroundworker, ou d'utiliser le même, avec le job différent...
J'espère avoir été clair. Si quelqu'un pourrai m'aiguiller, si possible, avec un exemple, car je ne maitrise pas trop les backgroundworker.
Partager