Comment puis-je utiliser un BackgroundWorker avec un timer tick?
Décidé de ne pas utiliser tous les compteurs.
Ce que j'ai fait est plus simple.
Ajouté un backgroundworker.
Ajout d'une Montre événement le cas d'incendie après tout, le constructeur ont été chargés.
Dans le cas im de départ le backgroundworker async.
Dans le backgroundworker DoWork im faire:
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
{
while(true)
{
cpuView();
gpuView();
Thread.Sleep(1000);
}
}
Vous devez vous connecter pour publier un commentaire.
Dans ce cas, il est préférable d'utiliser deux
System.Le filetage.Timer
et d'exécuter votre cpu-intensive des opérations dans ces deux threads. Veuillez noter que vous doit des contrôles d'accès avecBeginInvoke
. Vous pouvez encapsuler ces accès dans les propriétés setter ou encore mieux les tirer hors de vue de la classe du modèle.Vous ne pouvez pas simplement jeter ce code dans un contexte travailleur et espérer qu'il fonctionne. Rien que des mises à jour des éléments de l'INTERFACE (les étiquettes, les zones de texte, ...) doit être appelée sur le thread principal. Vous avez besoin de sortir votre logique pour obtenir les données et la logique de mise à jour de l'INTERFACE utilisateur.
Je dirais que votre meilleur pari est de faire ceci:
Dans le timer Tick() méthode:
Dans le fond travailleur DoWork() méthode:
Dans le fond travailleur a accompli() méthode:
D'abord assurez-vous d'obtenir votre tête autour de multithreathing et il y a des problèmes (en particulier des éléments d'INTERFACE utilisateur).
Ensuite, vous pouvez utiliser somethink comme
Veuillez garder à l'esprit (comme Jean Koerner dit vous) votre
cpuView()
etgpuView()
ne fonctionnera pas comme il est.Oui, vous pouvez:
Dans votre Timer tick événement:
Dans votre Backgroundworker dowork événement:
Je pense que
BackgroundWorker
est trop complexe chose pour le cas; avecTimer
il est difficile de mettre en œuvre la garantie de s'arrêter.Je tiens à vous recommander à l'aide de travailleur
Thread
avec la boucle qui attend à l'annulationManualResetEvent
pour l'intervalle que vous avez besoin de:Ici est la projet de version du code. Veuillez noter je ne l'ai pas testé, mais il pourrait vous montrer l'idée.
Dans mon cas, j'ai été en utilisant un BackgroundWorker ,un Système.Les minuteries.Minuterie et un ProgressBar dans WinForm Application. Ce que je suis venu à travers est sur la deuxième tique que je vais répéter le BackgroundWorker Do-Travail, j'ai un Cross-Thread Exception tout en essayant de mettre à jour ProgressBar dans ProgressChanged de BackgroundWorker .Ensuite, j'ai trouvé un solution sur DONC @Rudedog2 https://stackoverflow.com/a/4072298/1218551 qui dit que Quand vous initialiser les compteurs à zéro.Objet Timer pour une utilisation avec un Formulaire Windows, vous devez définir la SynchronizingObject propriété de la minuterie de l'instance de la forme.
http://msdn.microsoft.com/en-us/magazine/cc164015.aspx