2010-04-07 4 views
1

J'ai un code qui fait une demande de service Web. En faisant cette demande, j'ai besoin d'une barre de progression pour se déplacer indépendamment. Mon problème est que j'ai juste besoin d'exécuter une mise à jour toutes les 1 ou 2 secondes et de vérifier si la progression de la requête est terminée.BackgroundWorker Aide requise

NetBasisServicesSoapClient client = new NetBasisServicesSoapClient(); 
      TransactionDetails[] transactions = new TransactionDetails[dataGridView1.Rows.Count - 1]; 
      for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
      { 
       transactions[i] = new TransactionDetails(); 
       transactions[i].TransactionDate = (string)dataGridView1.Rows[i].Cells[2].Value; 
       transactions[i].TransactionType = (string)dataGridView1.Rows[i].Cells[3].Value; 
       transactions[i].Shares = (string)dataGridView1.Rows[i].Cells[4].Value; 
       transactions[i].Pershare = (string)dataGridView1.Rows[i].Cells[5].Value; 
       transactions[i].TotalAmount = (string)dataGridView1.Rows[i].Cells[6].Value; 
      } 
      CostbasisResult result = client.Costbasis(dataGridView1.Rows[0].Cells[0].Value.ToString(), dataGridView1.Rows[0].Cells[1].Value.ToString(), transactions, false, "", "", "FIFO", true); 
      string result1 = ConvertStringArrayToString(result.Details); 
+3

Quelle est la question? – leppie

+0

Je suis vraiment confus avec background-worker. Obtenir des rapports contradictoires sur ce qu'il faut faire. Je ne sais pas comment intégrer mon code ci-dessus dans un événement doWork. –

Répondre

4

J'utilise le fond Travailleurs tout le temps, ils sont parfaits pour le traitement des actions à long terme.

de votre code

#region Background Work of My Request 

    private void ProcessMyRequest() 
    {    
     if (!bkgWorkerMyRequest.IsBusy) 
     { 
      lblMessageToUser.Text = "Processing Request..."; 
      btnProcessRequest.Enabled = false; 
      bkgWorkerMyRequest.RunWorkerAsync(); 
     } 
    } 
    private void bkgWorkerMyRequest_DoWork(object sender, DoWorkEventArgs e) 
    { 
     // let's process what we need in a diferrent thread than the UI thread 
     string r = GetStuffDone(); 
     e.Result = r; 
    } 
    private void bkgWorkerMyRequest_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
    { 
     string myResult = (String)e.Result;  

     lblMessageToUser.Text = myResult; 
     btnProcessRequest.Enabled = true; 
    } 

#endregion 

    private function string GetStuffDone() 
    { 
     NetBasisServicesSoapClient client = new NetBasisServicesSoapClient(); 
     TransactionDetails[] transactions = new TransactionDetails[dataGridView1.Rows.Count - 1]; 
     for (int i = 0; i < dataGridView1.Rows.Count - 1; i++) 
     { 
      transactions[i] = new TransactionDetails(); 
      transactions[i].TransactionDate = (string)dataGridView1.Rows[i].Cells[2].Value; 
      transactions[i].TransactionType = (string)dataGridView1.Rows[i].Cells[3].Value; 
      transactions[i].Shares = (string)dataGridView1.Rows[i].Cells[4].Value; 
      transactions[i].Pershare = (string)dataGridView1.Rows[i].Cells[5].Value; 
      transactions[i].TotalAmount = (string)dataGridView1.Rows[i].Cells[6].Value; 
     } 
     CostbasisResult result = client.Costbasis(dataGridView1.Rows[0].Cells[0].Value.ToString(), dataGridView1.Rows[0].Cells[1].Value.ToString(), transactions, false, "", "", "FIFO", true); 
     return ConvertStringArrayToString(result.Details); 
    } 

tout ce que vous devez faire est d'appeler la méthode:

ProcessMyRequest(); 

et il fera le travail. Si vous devez laisser le thread principal d'être au courant des progrès, vous pouvez utiliser la dans la méthode bkgWorkerMyRequest_DoWork événement ProgressChanged

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

vous devez modifier le code pour avoir

//reports a percentage between 0 and 100 
bkgWorkerMyRequest.ReportProgress(i * 10); 

Rappelez-vous :

alt text http://www.balexandre.com/temp/2010-04-07_1200.png

Vous cependant se coincer lorsque vous essayez de déboguer la méthode GetStuffDone comme il est que ce que je fais un peu dur débogage des applications multithread

Alors, est, tout debug sans travailleurs et appliquer les travailleurs. Fonctionne bien pour moi, laissez-moi savoir si vous avez besoin d'aide supplémentaire à ce sujet.


ajouté

Je ne l'ai pas au courant que vous obtenez la grille du travailleur, désolé, pour cela, il suffit d'envoyer la grille comme argument et de l'utiliser, s'il vous plaît changer:

bkgWorkerMyRequest.RunWorkerAsync(dataGridView1); 

string r = GetStuffDone((GridView)e.Argument); 

private function string GetStuffDone(GridView dataGridView1) 
+0

2 choses: Pour obtenir la barre de progression, vous avez // signale un pourcentage compris entre 0 et 100 bkgWorkerMyRequest.ReportProgress (i * 10); inside _DoWork .. mais d'où viens-je? # 2. Erreur Une référence d'objet est requise pour le champ non statique, la méthode ou la propriété 'SOAP_Client_Networth.Form1.dataGridView1' –

+0

Vous devez définir cet entier, c'est vous le responsable de dire la progression du travail effectué, .NET ne sait pas ... * 10 est juste pour vous rappeler explicitement que c'est en pourcentage. Vous ne pouvez pas accéder à un autre objet Objet, vous devez utiliser les appels Safe Thread. Le seul endroit où vous pouvez accéder à l'objet Thread principal se trouve dans RunWorkerCompleted. Mais c'est une autre question, n'est-ce pas? ;-) – balexandre

+0

Il compile maintenant. Cependant, je reçois cette erreur lorsque je l'exécute. Ce BackgroundWorker indique qu'il ne signale pas les progrès. Modifiez WorkerReportsProgress pour indiquer qu'il signale la progression. –

0

Créer une BackgroundWorker (appeler l'instance "bgw") et tapez "bgw.DoWork + =" suivi de TAB. Visual Studio génère ensuite la méthode du gestionnaire d'événements DoWork. Copiez le code ci-dessus dans le gestionnaire et le tour est joué. Je ne pense pas qu'il soit logique que vous signaliez des progrès, puisque votre progression est déterminée par la durée de la demande de service Web sur laquelle vous n'avez aucune influence (et vous ne pouvez pas la diviser en tâches plus petites). En tant que tel, affichez simplement la boîte de dialogue «Faire le travail» et lancez la tâche en arrière-plan pour appeler le service Web. Quand c'est fait, fermez le dialogue "Faire le travail".