完成第一个过程后如何运行第二个过程

时间:2019-03-08 13:37:55

标签: c# multithreading linq task filestream

我每5秒钟生成一个新的文本文件,并在其中写入记录。我为这两个过程生成了不同的方法。因此,它首先创建一个文件,然后开始处理以向其中写入数据;如果在5秒钟后再次访问创建文件方法,则记录又没有完全写入先前的文件中。那么,如何使它完整,然后创建新文件?

我正在应用以下代码进行实施:

const string filePath = @"D:\TestSymbolsData.txt";
public static void ReadAndWriteInFile()
{
     Timer timer = new .Timer(new TimerCallback(createtxtFile));
     timer.Change(0L, 5000);

     File.ReadLines(filePath).ToList().Take(1000)
                .AsParallel()
                .Select(JsonConvert.DeserializeObject<List<LiveAMData>>)
                .ForAll(WriteRecordTest);
}

static StreamWriter tempWriter;
static System.Threading.Tasks.Task t1;
public static async void WriteRecordTest(List<LiveAMData> data)
{
     List<LiveAMData> data1 = data.AsParallel().Where(x => symbolList.Contains(x.sym)).ToList();
     foreach (var dt in data1)
     {
          t1 = Task.Run(() =>
          {
              var result = new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc).AddTicks(((long)dt.s) * TimeSpan.TicksPerMillisecond);
              DateTime newDT = TimeZoneInfo.ConvertTimeFromUtc(result, targetZone);
              lock(tempWriter)
              {
                  tempWriter.WriteLine(dt.sym + ", " + newDT.ToString("dd/MM/yyyy HH:mm:ss fff tt") + ", " + dt.v);
              }
          });
     }
}

public static void createtxtFile(object state)
{
    if(t1 != null)
    {
        Task.WhenAll(t1);
        sLogFname = $@"D:\LogFiles\{DateTime.Now:yyyyMMdd_HHmmss}.txt";
        tempWriter = new StreamWriter(new FileStream(sLogFname, FileMode.Append, FileAccess.Write));
    }
    else
    {
        sLogFname = $@"D:\LogFiles\{DateTime.Now:yyyyMMdd_HHmmss}.txt";
        tempWriter = new StreamWriter(new FileStream(sLogFname, FileMode.Append, FileAccess.Write));
    }
}

和文件中的最后一行变得像在过程中停止并生成新文件一样。

CORE, 05/02/2019 10:27:00 000 AM, 548
YUM, 05/02/2019 10:27:00 000 AM, 1109
DVY, 05/02/2019 10:27

实际上最后一条记录DVY是一半数据,几乎在每个文件中都发生这种情况。

因此,我认为此问题是由于第二个进程(创建文件)而发生的。那么我应该申请哪种解决方案来解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为,将tempwriter对象用作锁定对象是一个坏主意...

但是,更重要的是,您仅将临时写入器锁定在WriteRecordTest中,因此该锁定在createtextfile中没有用。

我认为,只要您使用自己的代码甚至是同一类,就应该可以使用简单的布尔变量来锁定对文件资源的访问

  • 检查布尔值是否为false,如果不执行任何操作
  • 然后将布尔值设置为true并完成您的工作(一方面,写入文件,另一方面刷新文件并重新打开下一个)

有了这个提示,应该可以解决您的问题...

[编辑于2019-03-11:]

起初,我认为为您提供对代码的更正很容易。但是再看一遍,我看不到您想要实现什么。