首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WriteXml不保存文件

WriteXml不保存文件
EN

Stack Overflow用户
提问于 2021-11-30 05:49:44
回答 1查看 41关注 0票数 0

我有一个任务是每10秒将我的DataTable保存到一个文件中:

代码语言:javascript
复制
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秒保存一次

代码语言:javascript
复制
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中的每个用户更新时间戳

代码语言:javascript
复制
void UvalClockTaksAsync()
    {
        foreach (DataRow row in users.Rows)
        {
            if (Convert.ToDouble(row[uvaltimePost]) < TimeCurrent)
                row[uvaltimePost] = TimeCurrent;
        }
    }

在这里我做了省钱

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

发布于 2021-11-30 06:14:29

如果文件具有大量数据,则在物理路径中写入可能需要一些时间。所以你能增加时间线(Thread.Sleep(10000);)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70164908

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档