Comment écrire des lignes dans un fichier texte thread-safe - multi threading
J'ai juste essayé et il a échoué
public MainWindow()
{
InitializeComponent();
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
Task.Factory.StartNew(() =>
{
writeFile();
});
}
TextWriter myWriter = new StreamWriter("deneme.txt");
void writeFile()
{
for (int k = 0; k < 10000; k++)
{
int irTempPara = k;
Task.Factory.StartNew(() =>
{
writeFileForReal(irTempPara);
});
System.Threading.Thread.Sleep(10);
}
}
void writeFileForReal(int srParameter)
{
for (int k = 0; k < 999999999; k++)
{
myWriter.WriteLineAsync(srParameter + "_" + k);
}
}
C'est c# 4.5 application WPF
Alors, quelle méthode suggérez-vous pour écrire des lignes dans un fichier texte le plus efficacement et le multi threading
Avez-vous besoin pour préserver l'ordre des lignes?
blogs.microsoft.co.il/blogs/bnaya/archive/2012/01/28/...
IamStalker nope. la ligne de commande n'est pas important.
blogs.microsoft.co.il/blogs/bnaya/archive/2012/01/28/...
IamStalker nope. la ligne de commande n'est pas important.
OriginalL'auteur MonsterMMORPG | 2013-03-02
Vous devez vous connecter pour publier un commentaire.
Comment à ce sujet?
Votre objectif doit être thread de sécurité, plutôt que l'efficacité si l'efficacité des moyens de la performance. En raison de la structure physique de la commune de disques durs (sauf pour le RAID), plusieurs threading dans l'écriture de fichier ne sera pas accélérer la performance globale. Le disque est en rotation avec le r/w d'un mouvement de tête, de sorte que toutes les demandes de lecture/écriture sont vraiment synchronisé.
ok je suis en train d'essayer seule ligne d'écriture avec un autre logiciel. la ligne n'apparaît jamais sur le fichier texte. pourquoi ne pourrait-il se passer ?
comme celui-ci : txtWriterMultiThread.WriteLine("asdsadas" + "_" ); tout seule ligne d'écriture, mais n'apparaît jamais sur le fichier de bloc-notes. il est vide
Dans l'ensemble je voir vos codes d'utilisation du Système.Le filetage.Les tâches qui est de la programmation parallèle, tandis que votre cas d'utilisation semblent juste besoin d'un appel asynchrone. Et je vous recommande de lire quelques articles sur la programmation parallèle, dans le blogs.msdn.com/b/pfxteam/archive/2012/03/25/10287435.aspx. Avec des appels asynchrones, vous pouvez avoir une fonction d'assistance avec une telle mise en œuvre de l'Action: d=()=>{TextWriter.Synchronisée(myWriter).WriteLine(...);}; d.BeginInvoke(null, null);
OriginalL'auteur ZZZ
Vous pouvez simplement utiliser simple TPL comme vous l'avez fait, mais vous pouvez définir:
http://coderkarl.wordpress.com/2012/12/13/long-running-tasks-and-threads/
C'est dire que la Tâche n'est pas un thread d'arrière-plan
OriginalL'auteur IamStalker
Vous ne devez jamais compter sur le Sommeil pour la synchronisation multi-threading. Au lieu de cela, prendre en compte l'utilisation d'un mécanisme de synchronisation comme un sémaphore ou un mutex.
De messagerie unifiée, non, c'est absolument important. Si vous voulez en écriture "multithread" alors vous pour le comprendre.
Considérons un sémaphore nommé, parce qu'alors vous pouvez l'utiliser à travers des processus (par exemple, si vous avez un webgarden) et également si vous utilisez async/await modèle, il peut être de retour sur un autre thread, ce qui va provoquer un blocage d'un mutex, car seul le thread qui obtient le mutex peuvent libérer.
OriginalL'auteur niculare
Nous pouvons utiliser ReaderWriterLockSlim http://www.johandorper.com/log/thread-safe-file-writing-csharp
Juste un PTI - le
sw.close()
est inutile puisque c'est fermé automatiquement une fois le processus de sorties de l'aide de portée.OriginalL'auteur Palanikumar