C# Thread D'Arrière-Plan
Permettez-moi de décrire ce que je suis en train de réaliser. Je suis à la programmation en C#.
J'ai une fonction (méthode) DoCalculations(). Je tiens à appeler cette DoCalculations() la méthode récursive. Toutefois, en C# je obtenir exception exception non gérée du Système.StackOverflow.
Donc, je suis en train de lancer DoCalculations() la méthode sur le fil.
Sur l'événement LOAD du FORMULAIRE. J'ai fait suivant:-
Thread objThread = new Thread(new ThreadStart(DoCalculations));
Sur le BOUTON DÉMARRER CLIQUEZ sur l'événement. Je suis en train de créer le Thread comme suit.
objThread.IsBackground = true;
objThread.Start();
while (!objThread.IsAlive)
{
}
Et j'ai l'intention d'exécuter la méthode DoCalculations() en permanence au-dessus de la Boucle While.
DoCalculations()
{
//some calculations.
}
Je ne reçois pas le contrôle dans DoCalculations() la méthode la fois. Cependant, je tiens à le faire à chaque instant.
S'il vous plaît si quelqu'un peut m'aider en ce qui concerne sol en arrière, filetage, ou est-il une meilleure façon de parvenir à faire le calcul en parallèle.
J'ai utilisé l'approche ci-dessus dans VB.NET me faisant plus confus pourquoi sa ne fonctionne pas dans C#.NET
Toute l'assistance, les commentaires sont grandement appréciées.
Merci
AP
- Qu'entendez-vous par -
I do get control in DoCalculations() method one time
? - Pourquoi n'essayez-vous pas de fixation à l'exception de dépassement de pile?
- "Je veux appeler cette DoCalculations() la méthode récursive." - Ne
DoCalculations
appeler lui-même? Êtes-vous sûr que la résiliation condition est-elle correcte? - Vous avez mal compris ce que ".IsBackground" signifie. Si .IsBackground est vrai pour un fil, puis lorsque le thread du processus parent est résiliée, le thread sera également résilié. Si .IsBackground est faux pour un fil, puis lorsque le thread du processus parent est terminée, le processus sera gardé en vie jusqu'à ce que le thread se termine. C'est la seule différence.
- Basé sur le code que vous avez fourni la boucle While n'aura jamais de fin. Donc, si vous faites quelque chose qui prend de la mémoire, vous avez une boucle qui ne se termine jamais, dans un sujet séparé.
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, utiliser un arrière-plan travailleur, car il est plus facile à utiliser et plus rapide.
Seconde, votre code de boucle devrait aller dans le thread d'arrière-plan.
Voici un code pour obtenir vous avez commencé.
EDIT: Il semble que vous êtes juste essayer de fixer un débordement de pile, et ne sachant pas comment le faire. Oubliez le multithreading, au lieu d'appeler DoCalculations de manière récursive, en appel dans une boucle, et assurez-vous que la boucle sait quand la fin. Aussi, si vous ne voulez pas le blocage de l'interface graphique pendant ce temps, puis un thread d'arrière-plan est mieux de toute façon.
Si vous obtenez une exception de dépassement de pile, la façon de faire disparaître va pas être découvert par l'introduction de multithreading. Il y a un bug dans votre code récursif.
Système.Le filetage.Minuterie Fournit un mécanisme pour l'exécution d'une méthode à des intervalles spécifiés.
Comment l'Utiliser dans votre cas....
Déclarer minuterie de rappel et de l'objet timer comme suit..
Et à votre Charge() événement initialiser..
Maintenant, votre méthode de calcul....
Si vous voulez l'exécuter repeadetly sur un thread d'arrière-plan, vous pouvez utiliser le
System.Threading.Timer
classe comme ceci:Cela permettra de exécuter votre caclulations à chaque seconde. Si vous voulez ajuster le temps, de modifier la dernière
TimeSpan
paramètre.Utiliser La Classe BackgroundWorker
http://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx