C# 如何使用StreamWriter避免竞争条件

C# 如何使用StreamWriter避免竞争条件,c#,.net,race-condition,C#,.net,Race Condition,根据:,“默认情况下,StreamWriter不是线程安全的。请参阅TextWriter.Synchronized以获取线程安全包装器。”因此,我编写了一个方法并使用TextWriter.Synchronized来同步我的StreamWriter对象: static void GenerateData() { string fileName = Path.Combine(directory, "filenames.txt"); using

根据:,“默认情况下,StreamWriter不是线程安全的。请参阅TextWriter.Synchronized以获取线程安全包装器。”因此,我编写了一个方法并使用TextWriter.Synchronized来同步我的StreamWriter对象:

        static void GenerateData()
    {
        string fileName = Path.Combine(directory, "filenames.txt");

        using(StreamWriter names = new StreamWriter(fileName))
        {
            // Synchronize access to names
            TextWriter.Synchronized(names);

            // Create 100,000 test files
            // Take advantage of parallelism
            Parallel.For(0, 100001, i =>
                {
                    // Generate name of test file
                    string curFile = Path.Combine(directory, String.Format("test{0}.txt", i + 1));

                    // Store test file name in filenames.txt
                    names.WriteLine(curFile);

                    using(StreamWriter writer = new StreamWriter(curFile))
                    {
                        // Take advantage of multiple cores
                        //TextWriter.Synchronized(writer);

                        // For 30 lines ..
                        for(int j = 0; j < 30; j++)
                        {
                            List<Rule> rules = new List<Rule>();

                            // .. generate i rules
                            for(int k = 0; k < i; k++)
                            {
                                // Name of rule starts with r followed by random number in range [0, 9999]
                                string name = "r" + String.Format("{0}", random.Next(0, 10000));
                                // Rule priority is in range [0, 500]
                                int pty = random.Next(1, 501);
                                rules.Add(new Rule(name, pty));
                            }

                            // Write the list of rules to curFile
                            writer.WriteLine(String.Join(", ", rules.ToArray()));
                        };
                    }
                });
        }
    }
static void GenerateData()
{
字符串文件名=Path.Combine(目录,“filenames.txt”);
使用(StreamWriter名称=新StreamWriter(文件名))
{
//同步对名称的访问
TextWriter.Synchronized(名称);
//创建100000个测试文件
//利用并行性
对于(0,100001,i=>
{
//生成测试文件的名称
string curFile=Path.Combine(目录,string.Format(“test{0}.txt”,i+1));
//将测试文件名存储在filenames.txt中
name.WriteLine(curFile);
使用(StreamWriter=新StreamWriter(curFile))
{
//利用多核
//TextWriter.Synchronized(writer);
//30行。。
对于(int j=0;j<30;j++)
{
列表规则=新列表();
//…生成i规则
对于(int k=0;k
然而,尽管如此,输出文件(filenames.txt)中的一些行仍然与其他行混淆。我想知道是否可以在不使用StreamWriter上的锁的情况下修复此问题

样本输出:

  • C:\Users\Frank\Documents\visualstudio 2013\Projects\TimedAssignment3\TimedAssignment3\Datasets\test1.txt
  • C:\Users\Frank\Documents\visualstudio 2013\Projects\TimedAssignment3\TimedAssignment3\Datasets\test50001.txt
  • C:\Users\Frank\Documents\visual studio 2013\Projects\TimedAssignment3\TimedAssignment3\Datasets\tesal studio 2013\Projects\TimedAssignment3\TimedAssignment3\Datasets\test37501.txt
  • C:\Users\Frank\Documents\visualstudio 2013\Projects\TimedAssignment3\TimedAssignment3\Datasets\test87501.txt
  • C:\Users\Frank\Documents\visualstudio 2013\Projects\TimedAssignment3\TimedAssignment3\Datasets\test12501.txt

  • 像这样使用返回的
    TextWriter

    var syncWriter = TextWriter.Synchronized(names);
    
    MSDN()表示:

    对返回包装的所有写入操作都是线程安全的。你 调用此方法以确保一次只能执行一个线程 返回的TextWriter实例上的方法


    Synchronized()?在编写
    filenames.txt
    之后,您能给我们看一下它的内容吗?这样我们就知道您的意思了。@ConstantCoder我已经添加了几行输出内容