Результат, записанный в файл, не работает должным образом - PullRequest
0 голосов
/ 16 мая 2019

Я использую многопоточность, чтобы записать результат в файл. У меня есть 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)
    }

1 Ответ

1 голос
/ 16 мая 2019

Вы можете попробовать ReaderWriterLock Пространство имен : System.Threading

.NET Framework предоставляет несколько потоковых примитивов блокировки.ReaderWriterLock является одним из них.

Класс ReaderWriterLock используется для синхронизации доступа к ресурсу.В любой момент времени он допускает одновременный доступ на чтение к нескольким (по существу неограниченным) потокам или доступ на запись для одного потока.В ситуациях, когда ресурс читается часто, но обновляется нечасто, ReaderWriterLock обеспечит намного лучшую пропускную способность, чем эксклюзивная блокировка монитора.

Примеры класса ReaderWriterLock

Отредактировано


   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)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...