我有一个任务是每10秒将我的DataTable保存到一个文件中:
void WriteTask(DataTable dt, bool final)
{
if (final)
{
exiting = false;
}
while (!exiting)
{
lock (users)
{
try
{
dt.WriteXml(filePath+ "users.xml_be");
File.Copy(@$"{filePath}users.xml_be", @$"{filePath}users.xml_betemp");
File.Replace(@$"{filePath}users.xml_betemp", @$"{filePath}users.xml", @$"{filePath}users.xml_be2");
if (final)
exiting = true;
}
catch (Exception ex)
{
try
{
File.AppendAllText($"{filePath}log.txt", $"{DateTime.Now.ToString()} {ex.Message}" + Environment.NewLine);
File.AppendAllText($"{filePath}log.txt", $"{ex.StackTrace}" + Environment.NewLine);
File.AppendAllText($"{filePath}log.txt", "////////////////////////////////////////////////////////////////" + Environment.NewLine);
}
catch (Exception)
{
client.SendMessage(tChannel, ErrorMes1);
client.SendMessage(tChannel, $"{ex.Message}|{ex.StackTrace}");
}
}
}
Thread.Sleep(10000);
}
}最近,我注意到这个文件并没有改变。最奇怪的想法是,当我在notepad++中打开文件时,它说文件已经被更改了,它想要重新加载它,但在我重新加载文件之后,里面没有更改。会不会是因为文件变得很大?它有大约一百万行。
更新:因此,我为所有与数据表有关的事情创建了异步任务:任务处于无休止的循环中,每30秒保存一次
async void WriteTask(DataTable dt, bool final)
{
if (final)
{
exiting = false;
}
while (!exiting)
{
Task UvalClockTaksTask = new Task(() => UvalClockTaksAsync());
Task dbSavingTask = new Task(() => WriteTaskAsync(dt, final));
Console.WriteLine("start saving");
UvalClockTaksTask.Start();
await UvalClockTaksTask;
dbSavingTask.Start();
await dbSavingTask;
Console.WriteLine("saved");
Thread.Sleep(30000);
}
}在这里,我将为dt中的每个用户更新时间戳
void UvalClockTaksAsync()
{
foreach (DataRow row in users.Rows)
{
if (Convert.ToDouble(row[uvaltimePost]) < TimeCurrent)
row[uvaltimePost] = TimeCurrent;
}
}在这里我做了省钱
void WriteTaskAsync(DataTable dt, bool final)
{
try
{
dt.WriteXml(filePath + "users.xml_be");
File.Replace(@$"{filePath}users.xml_be", @$"{filePath}users.xml", @$"{filePath}users.xml_be2");
if (final)
exiting = true;
}
catch (Exception ex)
{
try
{
File.AppendAllText($"{filePath}log.txt", $"{DateTime.Now.ToString()} {ex.Message}" + Environment.NewLine);
File.AppendAllText($"{filePath}log.txt", $"{ex.StackTrace}" + Environment.NewLine);
File.AppendAllText($"{filePath}log.txt", "////////////////////////////////////////////////////////////////" + Environment.NewLine);
}
catch (Exception)
{
client.SendMessage(tChannel, ErrorMes1);
client.SendMessage(tChannel, $"{ex.Message}|{ex.StackTrace}");
}
}
}而且它仍然不是每次都保存,最奇怪的是文件users.xml和users.xml_be是不一样的!用户的时间戳总是相差10秒。我是说wtf
发布于 2021-11-30 06:14:29
如果文件具有大量数据,则在物理路径中写入可能需要一些时间。所以你能增加时间线(Thread.Sleep(10000);)
https://stackoverflow.com/questions/70164908
复制相似问题