J'essaie d'exécuter une tâche en arrière-plan en vérifiant une base de données pour un certain nombre d'enregistrements dans une table, et si le numéro a changé depuis la dernière vérification, obtenir ces enregistrements, et faire travaille dessus. En utilisant le code suivant, j'obtiens un débordement de pile au bout de deux heures environ. L'application ne fait rien pendant cette période, vérifie simplement et aucun travail n'est ajouté à la base de données.C# .net looping débordement de pile de threads
private Thread threadTask = null;
private int recordCount = 0;
private void threadTask_Start()
{
if (threadTask == null) {
threadTask = new Thread(taskCheck);
threadTask.Start();
}
}
private void taskCheck()
{
int recordCountNew = GetDBRecordCound();
if (recordCountNew != recordCount)
{
taskDo();
recordCount = recordCountNew; // Reset the local count for the next loop
}
else
Thread.Sleep(1000); // Give the thread a quick break
taskCheck();
}
private void taskDo()
{
// get the top DB record and handle it
// delete this record from the db
}
Quand il déborde, il y a une tonne de taskCheck()
dans la pile d'appels. Je devine que taskCheck() ne se termine jamais jusqu'à ce que taskCheck() se termine, ergo débordement, et donc pourquoi ils restent tous dans la pile. Ce n'est évidemment pas la bonne façon de procéder, alors qu'est-ce que c'est?
N'appelez-vous pas taskCheck() en bas de taskCheck()? Le trait de soulignement est une faute de frappe, non? – lotsoffreetime
Je pense que je vois d'où vous venez. Non - C#/.NET ne s'applique pas TCO - vous devez faire la boucle manuellement. – viraptor