Thread safe StreamWriter C# how to do it? 2

后端 未结 4 1671
终归单人心
终归单人心 2020-12-30 09:53

So this is a continuation from my last question - So the question was \"What is the best way to build a program that is thread safe in terms that it needs to write double va

4条回答
  •  心在旅途
    2020-12-30 10:17

    So you're saying you want a bunch of threads to write data to a single file using a StreamWriter? Easy. Just lock the StreamWriter object.

    The code here will create 5 threads. Each thread will perform 5 "actions," and at the end of each action it will write 5 lines to a file named "file."

    using System;
    using System.Collections.Generic;
    using System.IO;
    using System.Threading;
    
    namespace ConsoleApplication1 {
        class Program {
            static void Main() {
                StreamWriter Writer = new StreamWriter("file");
    
                Action ThreadProcedure = (i) => {
                    // A thread may perform many actions and write out the result after each action
                    // The outer loop here represents the multiple actions this thread will take
                    for (int x = 0; x < 5; x++) {
                        // Here is where the thread would generate the data for this action
                        // Well simulate work time using a call to Sleep
                        Thread.Sleep(1000);
                        // After generating the data the thread needs to lock the Writer before using it.
                        lock (Writer) {
                            // Here we'll write a few lines to the Writer
                            for (int y = 0; y < 5; y++) {
                                Writer.WriteLine("Thread id = {0}; Action id = {1}; Line id = {2}", i, x, y);
                            }
                        }
                    }
                };
    
                //Now that we have a delegate for the thread code lets make a few instances
    
                List AsyncResultList = new List();
                for (int w = 0; w < 5; w++) {
                    AsyncResultList.Add(ThreadProcedure.BeginInvoke(w, null, null));
                }
    
                // Wait for all threads to complete
                foreach (IAsyncResult r in AsyncResultList) {
                    r.AsyncWaitHandle.WaitOne();
                }
    
                // Flush/Close the writer so all data goes to disk
                Writer.Flush();
                Writer.Close();
            }
        }
    }
    

    The result should be a file "file" with 125 lines in it with all "actions" performed concurrently and the result of each action written synchronously to the file.

提交回复
热议问题