Come lasciare scrivere più thread sullo stesso file [chiuso]

2

Ho un file di testo chiamato "vholders.txt".

Sto facendo più thread come puoi vedere qui, quei thread lavorano con i loro dati dati e alla fine scrivono il loro output su vholders.txt . Ma ottengo IO eccezione perché il file viene utilizzato da un altro thread. Quindi, come posso scrivere su vholders.txt file senza entrare in collisione con altri thread. La sequenza di quale thread deve scrivere per prima non ha importanza.

questo è il mio codice:

public void execute()
    {
        for(int x=0;x<entered_length;x++)
        {
            ThreadPool.QueueUserWorkItem(new WaitCallback(PooledProc),x);
        }

    }
    private void PooledProc(object x_)
    {
        string output = string.Empty;
        //does the processing...and assign output its value...
        /*this is where I get error*/
        StreamWriter sw = File.AppendText("vholders.txt"); //error, file is being used by another process
        sw.WriteLine(output);
        sw.Close();
        /*Now how can I write the output value to the text file vholders.txt without getting IO Exception*/
    }
    
posta AKC 30.01.2016 - 14:57
fonte

1 risposta

6

In C # puoi usare la classe ReaderWriteLock per consentire una singola operazione di scrittura nel tuo file (e più lettori, se necessario).

Inoltre, per massimizzare le prestazioni puoi avere operazioni asincrone usando File asincrono I / O (è possibile avere un po 'di elaborazione mentre si eseguono le operazioni di I / O).

Tuttavia, prima di immergerti in questi concetti, è necessario chiarire alcune cose per ottenere la soluzione più semplice per il tuo problema:

  1. hai qualche lettore dal tuo file mentre è in fase di scrittura?
  2. è un processo continuo o accade solo più volte al giorno?
  3. stai elaborando dati di grandi dimensioni (GB?)

Se la risposta è No a tutte le domande di cui sopra, potresti considerare di eseguire tutta l'elaborazione in memoria e scrivere tutti i output in una volta.

    
risposta data 30.01.2016 - 16:20
fonte

Leggi altre domande sui tag