【发布时间】:2019-03-08 13:37:55
【问题描述】:
我每 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是一半数据,几乎每个文件都会发生这种情况。
所以我认为这个问题是由于第二个过程(创建文件)而发生的。那么我应该申请什么解决方案来解决这个问题呢?
【问题讨论】:
-
在创建与文件的新连接之前,您可能必须确保与文件的连接已关闭/处置。
-
@Symon 我已经关闭了该文件的连接,因此它给出了“由于连接关闭而无法写入文件”的错误。文件的连接关闭也存在问题。
-
您必须重新建立连接才能开始写入该文件。查看
using语句可能会有所帮助。这些将非常无缝地打开和关闭/处理连接
标签: c# multithreading linq task filestream