Fond travailleur - rapport des progrès avec tableau de chaînes
J'ai besoin de retourner plusieurs valeurs de CHAÎNE de mon backgroundworker dans chaque tour de boucle, donc j'ai essayé d'utiliser ReportProgress deuxième paramètre comme un tableau de chaînes. Exemple de code:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
string[] workerResult = new string[2];
for (int i=0; i<someNumber; i++)
{
//do some heavy calculating
workerResult[0] = "this string";
workerResult[1] = "some other string";
backgroundWorker1.ReportProgress(i, workerResult) //also tried workerResult[] and [2]
}
}
private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
string[] results = (string[])e.UserState;
MessageBox.Show(results[0]); //line of error
MessageBox.Show(results[1]); //line of error
}
Il compile, mais l'exécution en ce moment j'essaie d'accéder à Userstate chaîne retournée, j'obtiens une erreur: "la référence d'Objet n'est pas définie à une instance d'un objet."
Pour moi, il semble lik quelque chose est incorrect lors du passage de paramètre de tableau de ProgressChanged délégué, ou dans ProgressChanged méthode lorsque vous tentez de définir des résultats de la matrice de valeurs.
Est-il une raison plus profonde pour laquelle vous exécutez
Aussi, pourquoi utiliser un tableau de chaînes de caractères, par rapport à une collection?
Désolé, mon erreur. Exemple était mauvais, devrait être bon maintenant.
backgroundWorker2
mais rapport sur backgroundWorker1
?Aussi, pourquoi utiliser un tableau de chaînes de caractères, par rapport à une collection?
Désolé, mon erreur. Exemple était mauvais, devrait être bon maintenant.
OriginalL'auteur andree | 2011-03-28
Vous devez vous connecter pour publier un commentaire.
Votre extrait de code est incapable de reproduire le problème. Une norme erreur est d'appeler ReportProgress() et puis pour continuer à modifier l'objet. Il faut un certain temps pour le gestionnaire d'événement pour l'exécuter, il va voir l'objet modifié, pas l'original. Vous évitez simplement de la création d'un nouvel objet, de sorte que le gestionnaire d'événements travaille toujours avec l'original. Comme ceci:
Notez comment la création de la matrice déclaration est déplacé à l'intérieur de la boucle.
OriginalL'auteur Hans Passant
lorsque vous instancier votre BackgroundWorker, vous aurez à reportprogress vrai:
Sur la méthode de travail, vous aurez juste besoin de ceci:
Alors quelque chose comme cela pour attraper le progrès:
Eh bien, vous venez d'appeler plusieurs fois le rapport de progrès: travailleur.ReportProgress(10, "Message1"); travailleur.ReportProgress(11, "Message2");
Ca résout mon problème, mais aussi en crée une nouvelle, depuis que je suis à jour de ma progressbar sur chaque ReportProgress() avec la progressBar.PerformStep().
si vous ne voulez pas de mise à jour (si il n'y a pas de progrès par exemple) il suffit de passer le même progrès sur les deux messages, ex: travailleur.ReportProgress(10, "Message1"); travailleur.ReportProgress(10, "Message2");
OriginalL'auteur dcarneiro
J'ai résolu un problème similaire par l'ajout d'un nouveau
ProgressChanged
écouteur d'événement à votre arrière-plan travailleur et bloquer le passage de la boucle suivante siProgressChanged
pas viré:désolé mais pas besoin de faire tout ça juste triste par Hans_passant, tout ce que vous avez à faire est d'insérer un tableau de chaîne de instanciation de l'intérieur de la boucle
OriginalL'auteur ykjmaster