J'ai écrit un petit programme interne en C# qui convertit en lots entre différents formats de fichiers, en s'appuyant principalement sur d'autres API. Actuellement, l'interface utilisateur génère un BackgroundWorker (pas un thread) pour gérer les conversions, puis remplit une file d'attente avec les demandes qui se vide lorsque le travailleur termine les tâches. Les objets de file d'attente eux-mêmes sont très petits (3 chaînes pour indiquer au travailleur quoi faire) et ne contribuent pas beaucoup à l'empreinte mémoire du programme. J'ai été assez draconien avec ma gestion de la mémoire (disposer des images quand elles sont terminées, et collecter manuellement les ordures à certains points.) Pourtant, le programme a tendance à utiliser environ 100 Mo de mémoire à la fois, et utilise environ 50% de temps total du processeur. Il semble que si j'utilisais naïvement le threading, il manquerait rapidement de mémoire système (à moins que le CLR ne fasse une sorte de magie que je ne connais pas.)Empêcher les applications multithread de manquer de mémoire
Y at-il un moyen simple/efficace de générer des threads pour éviter le système manque de mémoire en plus d'intercepter les exceptions OutOfMemory et de revenir sur le thread qui est mort (semble très inefficace, mais il n'y a aucun moyen de préserver l'état sans utiliser des quantités de mémoire prohibitives)?
De combien de threads parlons-nous? Vous parlez de l'assurance-chômage et d'un travailleur ... mais cela ne devrait pas être un gros problème; Frayez-vous * beaucoup * de fils? –
J'ai actuellement un objet BackgroundWorker (pas un Thread). Je voudrais ajouter plus pour permettre une plus grande utilisation de CPU mais empêcher le système de manquer de mémoire. Comme je l'ai dit, l'interface utilisateur avec un opérateur prend jusqu'à 100 Mo de RAM, donc même en ajoutant quelques threads supplémentaires pourrait être un problème. Les tâches par lot peuvent généralement contenir plus de 100 fichiers. – pschorf