Thread safe StreamWriter C # how to do this? 1

What is the best way to create a program that is thread safe, in the sense that it needs to write double values ​​to a file. If a function that stores values ​​through a streamwriter is called by multiple threads? What is the best way to do this?


Comment Code:

    static void Main()
    {
        List<double> Values = new List<double>();
        StreamWriter writer = new StreamWriter("test.out");

        for (int i = 0; i < 1000; i++) Values.Add(i);

        foreach (double V in Values)
        {
            ThreadPool.QueueUserWorkItem(delegate(object state) { SaveValues(writer, V); }, V);
        }
    }

    static void SaveValues(StreamWriter writer, double Value)
    {
        lock (writer) writer.WriteLine(Value);
    } 
+5
source share
5 answers

Edit, after decoding the code in your comment

, . , "" V, , , 999. , , .

, :

foreach (double V in Values)
{  
   ThreadPool.QueueUserWorkItem(delegate(object state) 
        { SaveValues(writer, V); }, V); // use of captured V: almost always 999
}

foreach (double V in Values)
{
    double W = V;
    ThreadPool.QueueUserWorkItem(delegate(object state)
       { SaveValues(writer, W); }, V);
}

, ,

foreach (double V in Values)
{
    double W = V;
    ThreadPool.QueueUserWorkItem((state) => SaveValues(writer, W));
}

@Matti, . - (, StreamWriter).

private StreamWriter writer = ...;         
private Object writerLock = new Object();  // don't expose through a property 
// or any other way

lock (writerLock)
{
    writer.Write(...);
}

, SaveValues(StreamWriter writer, ...), . , writer writerLock .

+5

TextWriter.Synchronized

TextWriter. ll , .

+7

.

lock (myStreamWriter) {
    myStreamWriter.Write(...);
}

, . , , , .

+3

/ , .

+3

StreamWriter ( , , StreamWriter). , , .

, . StreamWriter. .

. , . , , , .

Edit

, .NET, . , , /.

+2

All Articles