2009-03-24 6 views
3

Je dois être en mesure d'enregistrer un fichier, malheureusement il peut être très volumineux, donc l'enregistrement peut prendre quelques minutes. Comme je dois le faire à partir d'un thread graphique, je ne veux pas empêcher l'exécution de l'interface graphique. Je pensais à tenter l'opération de sauvegarde sur un thread séparé pour permettre au thread principal de l'interface graphique de continuer à s'exécuter.Threads C# pour la manipulation de fichiers

Existe-t-il une manière agréable (facile) de générer un nouveau thread, de sauvegarder le fichier et de détruire le thread sans effets secondaires?

Il faut dire que je n'ai JAMAIS eu besoin d'utiliser des fils auparavant donc je suis un novice complet! Toute aide, d'où qu'elle vienne, sera très appréciée!

Répondre

5

BackgroundWorker (comme suggéré par Frederik) est un bon choix, en particulier si vous voulez signaler les progrès à l'interface utilisateur pendant que vous économisez. Un search for BackgroundWorker tutorial obtient beaucoup de hits, donc vous devriez être capable de suivre l'un de ceux pour vous aider à démarrer. Une chose à faire attention: y aurait-il un moyen de changer la structure de données que vous allez essayer d'enregistrer à partir du thread de l'interface utilisateur? Si c'est le cas, vous devriez désactiver ces aspects de l'interface utilisateur pendant que vous sauvegardez - il serait (probablement!) Mauvais d'être à mi-chemin de la sauvegarde des données, puis de permettre à l'utilisateur d'en changer. Si vous pouvez vous en passer en transférant efficacement les données au thread d'arrière-plan et en ne les touchant pas depuis le fil d'interface utilisateur, cela vous facilitera la vie.

+0

Je pense qu'il serait préférable de faire une copie des données et de les transmettre à l'arrière-plan plutôt que de désactiver des parties de l'interface utilisateur. – Quibblesome

+0

@Quarrelsome: Parfois. Cela dépend vraiment de la situation et si l'utilisateur s'attend à ce que le résultat soit un instantané ou non. Dans certains cas, il peut être très difficile d'obtenir un instantané complet - il est préférable d'avoir un programme fiable mais légèrement ennuyeux qu'un programme brisé :) –

5

Vous pourriez peut-être utiliser le composant BackGroundWorker, car il résumera un peu la partie Threading pour vous.

3

Votre problème est peut-être qu'il existe plusieurs façons simples et agréables de le faire. Si vous voulez juste pour désactiver la sauvegarde de fichier et ne vous inquiétez pas de savoir quand il a terminé, puis d'avoir une méthode

void SaveMyFile(object state) 
{ 
    // SaveTheFile 
} 

et de l'appeler avec

ThreadPool.QueueUserWorkItem(SaveMyFile); 

fera ce que vous voulez.

0

ou vous pourriez utiliser des anciens amis délégués.

3

Je recommande de faire des E/S asynchrones. C'est un peu plus facile à configurer et vous n'avez pas besoin de créer vous-même de nouveaux sujets.

La programmation asynchrone est l'endroit où vous avez, par exemple, un flux de fichier dans lequel vous voulez écrire mais ne souhaite pas attendre que cela se termine. Vous voudrez peut-être être averti quand c'est fini mais vous ne voulez pas attendre.

Ce que vous faites est d'utiliser les fonctions BeginWrite/BeginRead et EndWrite/EndRead qui sont disponibles sur la classe Stream.

Dans votre méthode, vous commencez par appeler BeginWrite avec toutes les données que vous voulez écrire et passez également une fonction de rappel. Cette fonction sera appelée quand BeginWrite aura fini.

À l'intérieur de la fonction de rappel, vous appelez EndWrite, nettoyez le flux et vérifiez les erreurs. BeginWrite ne bloque pas ce qui signifie que s'il est appelé depuis un gestionnaire d'événements, ce thread peut terminer ce gestionnaire et continuer à traiter plus d'événements (tels que d'autres événements GUI).Le sommeil est assez important parce que le thread qui écrit des choses sera tué si le thread principal est tué. Ce n'est pas un problème dans une application graphique, seulement ici dans ce petit exemple.

MSDN a une pretty good overview sur la façon d'écrire ce genre de choses, et aussi quelques good articles sur la programmation Asynch en général au cas où vous allez pour le backgroundworker ou ThreadPool.

Questions connexes