代码之家  ›  专栏  ›  技术社区  ›  user726720

C#延迟写入XML

  •  2
  • user726720  · 技术社区  · 12 年前

    我正在使用Filesystemwatcher来获取一个文件,将其转换为UTF-8并将其传输到目标。现在我想要实现的是,我需要延迟将xml写入目的地。即仅15-20秒。我知道我可以在这里使用以下内容:

    System.Threading.Thread.Sleep(milliseconds);
    

    但如果我这样做,它会完全延迟线程,不是吗?文件系统观察程序会发生什么,它会停止拾取文件吗。我的目标是延迟但不要错过源文件夹中可能更改的任何文件。以下是我目前的做法:

    var doc = new XmlDocument();
    doc.Load(FileName);
    XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true };
    using (var writer = XmlWriter.Create(destinationFile, settings))
    {
        System.Threading.Thread.Sleep(15000);
        doc.Save(writer);
    }
    

    这将停止线程并延迟写入我想要的xml文件。但是,文件系统观察程序会发生什么,它也会停止吗?因为它是同一线程的一部分。

    3 回复  |  直到 12 年前
        1
  •  2
  •   I4V    12 年前

    您可以使用 System.Threading.Timer

    var doc = new XmlDocument();
    doc.Load(FileName);
    XmlWriterSettings settings = new XmlWriterSettings { Encoding = Encoding.UTF8, Indent = true };
    
    new System.Threading.Timer((_) =>
        {
            using (var writer = XmlWriter.Create(destinationFile, settings))
            {
                doc.Save(writer);
            }
        })
    .Change(15000, -1);
    
        2
  •  1
  •   06needhamt    12 年前

    为你想延迟的东西创建一个线程,为你不想延迟的事情创建一个单独的线程

    编辑试试这个

    System.Threading.Thread newThread;
    newThread = new System.Threading.Thread(anObject.AMethod); // one to delay
    
    System.Threading.Thread newThread2;
    newThread2 = new System.Threading.Thread(anObject.AMethod); //one not to delay
    

    然后添加 Threadname.Start(); 到要延迟的过程的开始,另一个在不想延迟的过程上。然后使用延迟

    System.Threading.Thread.Sleep(milliseconds);
    

    就像你以前做的那样

    希望这能有所帮助

        3
  •  0
  •   paparazzo    12 年前

    使用BlockingCollection怎么样?
    它在4.0上可用。
    Filesystemwatcher是生产者,使用者是xmlwrite。
    你可以睡在消费者身上,而不会影响生产者。

    BlockingCollection Class