【问题标题】:The result written to the file does not work as expected写入文件的结果没有按预期工作
【发布时间】:2019-10-04 00:25:07
【问题描述】:

我使用多线程将结果写入文件。我有 100 个结果,但保存到文件的结果数只有 30 个。我该怎么办?

    public async Task FileWriteAsync(string text)
    {
        string file = @"uid.txt";
        using (FileStream sourceStream = new FileStream(file, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
        using (StreamWriter f = new StreamWriter(sourceStream))
        {
            await f.WriteLineAsync(text);
        }
    }
    public void ExFile(int line)
    {

        var uid = Regex.Match(txt_ListUID.Lines[line], @"c_user=(.*?);").Groups[1].ToString().Trim();
        string text = uid + "|zxzxzx";
        _ = FileWriteAsync(text)
    }

【问题讨论】:

  • 如果没有某种 IO 同步(以避免交错打开/写入/关闭),您无法可靠地从多个线程写入同一个文件。从多个线程调用 ExFile() 的原因是什么?似乎没有必要。
  • 如果我运行多个线程,它会减少时间。

标签: c# multithreading asynchronous streamwriter


【解决方案1】:

你可以试试ReaderWriterLock 命名空间:System.Threading

.NET Framework 提供了几个线程锁定原语。 ReaderWriterLock 就是其中之一。

ReaderWriterLock 类用于同步对资源的访问。在任何给定时间,它允许对多个(基本上无限制的)线程进行并发读取访问,或者它允许对单个线程进行写入访问。在频繁读取资源但不经常更新资源的情况下,ReaderWriterLock 将提供比独占监视器锁更好的吞吐量。

ReaderWriterLock Class examples

已编辑


   public async Task FileWriteAsync(string text)
    {
      ReaderWriterLock locker = new ReaderWriterLock();
     try
       {
         locker.AcquireWriterLock(int.MaxValue); //You might wanna change timeout value 
         string file = @"uid.txt";
         using (FileStream sourceStream = new FileStream(file, FileMode.Append, FileAccess.Write, FileShare.None, bufferSize: 4096, useAsync: true))
         using (StreamWriter f = new StreamWriter(sourceStream))
         {
            await f.WriteLineAsync(text);
         }
        }
        finally
        {
            locker.ReleaseWriterLock();
        }
    }
    public void ExFile(int line)
    {

        var uid = Regex.Match(txt_ListUID.Lines[line], @"c_user=(.*?);").Groups[1].ToString().Trim();
        string text = uid + "|zxzxzx";
        _ = FileWriteAsync(text)
    }

【讨论】:

  • 如果包含在 try-finally 中,该命令将起作用。谢谢你。我将此标记为正确答案。
  • @TrầnCôngTrường 对不起,这是错误的,我已经纠正了。很高兴你解决了它。你可以投票。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-02
  • 2012-04-12
  • 2017-07-17
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
相关资源
最近更新 更多