invoquer lors d'arrière-plan travailleur
J'ai besoin d'invoquer cette: string input_ip_r = listView1.Items[lc].SubItems[1].Text;
j'ai donc utilisé
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(function));
return;
}
Cela a fonctionné, mais maintenant, je l'ai mis dans un BackgroundWorker
et à l'aide de cette
if (InvokeRequired)
{
this.Invoke(new MethodInvoker(bw.RunWorkerAsync));
return;
}
il donne une erreur que vous ne pouvez exécuter BackgroundWorker
un à la fois.
Alors, comment puis-je invoquer tandis que dans le Backgroundworker
?
Ok, je suis confus. a pourquoi mettre le code pour accéder à l'INTERFACE utilisateur dans un contexte de travail? b) vous essayez d'exécuter
Que voulez-vous dire? Le premier code est censé être exécuté à partir du thread d'arrière-plan (en appelant le thread d'INTERFACE utilisateur). Le deuxième code dirait qu'il essaie d'appeler le thread d'arrière-plan.
La chaîne doit être invoqué et je ne peux pas travailler sur la façon de le faire dans le cadre du travailleur, la "nouvelle MethodInvoker" essaye d'exécuter une seconde fois
bw.RunWorkerAsync
de l'intérieur bw.DoWork
?Que voulez-vous dire? Le premier code est censé être exécuté à partir du thread d'arrière-plan (en appelant le thread d'INTERFACE utilisateur). Le deuxième code dirait qu'il essaie d'appeler le thread d'arrière-plan.
La chaîne doit être invoqué et je ne peux pas travailler sur la façon de le faire dans le cadre du travailleur, la "nouvelle MethodInvoker" essaye d'exécuter une seconde fois
OriginalL'auteur Dasher Labs | 2012-12-19
Vous devez vous connecter pour publier un commentaire.
Je ne suis pas tout à fait sûr de savoir comment vous voulez utiliser les valeurs, mais juste pour vous donner un exemple, vous peut facilement le faire dans le
BackgroundWorker
fil:Voir cette réponse pour d'autres façons de faire de même (c'est pour >= .Net 3.5)
Je suis content que cela a fonctionné pour vous =) n'oubliez pas, cependant, que ce n'est qu'une des façons que vous pouvez aller avec elle. @Servy répondre a des points qui devraient également être considérés.
OriginalL'auteur Mario Sannum
1) Ne pas mettre
RunWorkerAsync
que la méthode à appeler. Ce n'est pas réellement l'exécution de la méthode que vous pensez. Ce que vous devriez vraiment mis il y a quelque chose comme ceci:MethodToUpdateUI
devrait y avoir une nouvelle méthode que vous créez et qui précisément fait ce que les mises à jour de l'INTERFACE utilisateur doit être faite dans ce contexte.2) Il n'y a pas besoin de
InvokeRequired
. Vous êtes dans un thread d'arrière-plan. Invoquant sera toujours nécessaire.Pour être honnête, l'ensemble de la formulation de
if(invoke required) call myself else do stuff
est une drôle de construire que je déteste.InvokeRequired
devrait assez rarement utilisé. Vous devriez presque toujours de savoir si vous êtes dans le thread de l'INTERFACE utilisateur ou d'un thread d'arrière-plan, si vous ne le faites pas, les chances sont quelque chose de mal, (vous êtes toujours dans l'un ou l'autre et vous ne savez pas qui, ou il ne devrait pas être non déterministe). Habituellement, cela signifie avoir des méthodes qui doit être exécuté dans le thread de l'INTERFACE utilisateur. Si vous êtes déjà dans le thread de l'INTERFACE utilisateur vous les appelez, si vous êtes dans un thread d'arrière-plan et de savoir ce que vous appelez ensuiteInvoke
premier.En plus de cela,
Invoke
fonctionne très bien, même si vous l'appelez lorsque vous êtes déjà dans le thread de l'INTERFACE utilisateur, donc il n'y a vraiment pas de répercussions négatives importantes pour appeler justeInvoke
indépendamment de savoir si vous êtes dans un thread d'arrière-plan ou déjà dans le thread de l'INTERFACE utilisateur.3) Généralement, il est préférable de séparer le code pour résoudre des problèmes d'affaires du code de l'INTERFACE utilisateur. C'est l'odeur de code à l'invocation de l'intérieur DoWork du gestionnaire. Si c'est à droite près de la fin, vous devriez probablement être l'ajout d'un gestionnaire d'événement pour
RunWorkerCompleted
. Si vous appelez régulièrement à jour l'INTERFACE utilisateur avec les progrès de l'ouvrier, vous devriez être en utilisantReportProgress
et de la manipulation duProgressReported
événement. Pour obtenir des informations à partir de l'INTERFACE utilisateur pour une utilisation dans une longue tâche, vous devez d'accès avant le démarrage de la tâche en arrière-plan. Pour des cas exceptionnels qui ne sont pas, il peut être approprié d'utiliserInvoke
, mais le reste des cas doit être rare.listView1.Items[lc].SubItems[1].Text
à l'intérieur de l'arrière-plan travailleur sans fil appelsOk. C'est ce que ma réponse est de vous aider à aborder.
Je suis tout à fait novice en c#, j'ai donc une boucle pour obtenir chaque élément de liste de le point 2 et comment le faire pénétrer à l'intérieur de l'arrière-plan travailleur à utiliser?
Prenez tous les éléments de la liste et de les mettre dans une structure de données, tel qu'un
List
ou d'un tableau. Ensuite stocker que comme une instance privée de champ et de l'utiliser en arrière-plan travailleur. De cette façon, vous n'êtes pas accéder à l'INTERFACE utilisateur de l'arrière-plan travailleur en premier lieu.OriginalL'auteur Servy