写入文件的结果与预期不符

时间:2019-05-16 17:02:27

标签: c# multithreading asynchronous streamwriter

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

uid | data

1   | {"item1":"string1", "item2":"string2"}
2   | {"item2":"string3", "item5":"string1", "item7":"string5"}
3   | {"item1":"string3", "item4":"string1", "item6":"string8", "item5":"string5"}
4   | {"item1":"string4"}

1 个答案:

答案 0 :(得分:1)

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

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

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

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)
    }