我每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是一半数据,几乎在每个文件中都发生这种情况。
因此,我认为此问题是由于第二个进程(创建文件)而发生的。那么我应该申请哪种解决方案来解决这个问题?
答案 0 :(得分:0)
我认为,将tempwriter对象用作锁定对象是一个坏主意...
但是,更重要的是,您仅将临时写入器锁定在WriteRecordTest
中,因此该锁定在createtextfile
中没有用。
我认为,只要您使用自己的代码甚至是同一类,就应该可以使用简单的布尔变量来锁定对文件资源的访问
有了这个提示,应该可以解决您的问题...
[编辑于2019-03-11:]
起初,我认为为您提供对代码的更正很容易。但是再看一遍,我看不到您想要实现什么。