TextWriter不写所有文件

时间:2011-01-25 10:54:32

标签: c# xml file-io xml-serialization

我已经编写了一个运行单独线程的服务,该服务从数据库读取大约400条记录并将它们序列化为xml文件。它运行正常,没有错误,它报告所有文件都已正确导出,但之后只出现了少量的xml文件,并且每次都有不同的数字。我已经检查过它是否是一个导致问题的记录,但它们都读得很好,似乎写了鳍,但是没有...

在每次写入之间玩耍并延迟250ms后,它们都被正确导出,所以我认为它必须与如此快速连续编写这么多文件有关,但我不知道为什么,我

,如果他们没有正确写出来会认为它会报告某种错误。

以下是任何想要尝试的人的代码:

static void Main(string[] args)
{
    ExportTestData();
}

public static void ExportTestData()
{
    List<TestObject> testObjs = GetData();

    foreach (TestObject obj in testObjs)
    {
        ExportObj(obj);
        //Thread.Sleep(10);
    }
}

public static List<TestObject> GetData()
{
    List<TestObject> result = new List<TestObject>();

    for (int i = 0; i < 500; i++)
    {
        result.Add(new TestObject()
        {
            Date = DateTime.Now.AddDays(-1),
            AnotherDate = DateTime.Now.AddDays(-2),
            AnotherAnotherDate = DateTime.Now,
            DoubleOne = 1.0,
            DoubleTwo = 2.0,
            DoubleThree = 3.0,
            Number = 345,
            SomeCode = "blah",
            SomeId = "wobble wobble"
        });
    }

    return result;
}

public static void ExportObj(TestObject obj)
{
    try
    {
        string path = Path.Combine(@"C:\temp\exports", String.Format("{0}-{1}{2}", DateTime.Now.ToString("yyyyMMdd"), String.Format("{0:HHmmssfff}", DateTime.Now), ".xml"));
        SerializeTo(obj, path);
    }
    catch (Exception ex)
    {

    }
}

public static bool SerializeTo<T>(T obj, string path)
{
    XmlSerializer xs = new XmlSerializer(obj.GetType());
    using (TextWriter writer = new StreamWriter(path, false))
    {
        xs.Serialize(writer, obj);
    }
    return true;
}

尝试评论\取消注释Thread.Sleep(10)以查看问题

有人知道为什么这样做吗?并且可以建议我如何避免这个问题?

由于

编辑:已解决。基于时间的文件名不够独特,并且覆盖了以前写入的文件。应该早点发现它,谢谢你的帮助

5 个答案:

答案 0 :(得分:1)

也许尝试将writer放入使用区块中以立即处置?像

这样的东西
XmlSerializer xs = new XmlSerializer(obj.GetType());
using(TextWriter writer = new StreamWriter(path, false)) 
{
    xs.Serialize(writer, obj);
}

答案 1 :(得分:1)

好的我发现了问题,我使用的是基于时间的文件名,我觉得这个文件对每个文件来说都是唯一的,结果是在一个紧密的循环中它们会出现相同的文件名并且覆盖过多彼此。

如果我更改它以使用实际上唯一的文件名,它就可以了!谢谢你的帮助

答案 2 :(得分:0)

处理作家

public static bool SerializeTo<T>(T obj, string path)
{
    XmlSerializer xs = new XmlSerializer(obj.GetType());
    using(TextWriter writer = new StreamWriter(path, false)) {
        xs.Serialize(writer, obj);
        writer.Close();
    }
    return true;
}

答案 3 :(得分:0)

如果你没有得到任何例外,那么其他答案提出的using语句将无济于事 - 尽管你应该改变以使用它们。此时,您不再需要近距离通话:

XmlSerializer xs = new XmlSerializer(obj.GetType());
using(TextWriter writer = new StreamWriter(path, false))
{
    xs.Serialize(writer, obj);
}
但是,我认为问题不在于此代码。我怀疑它是某些就像“在lambda表达式中捕获一个循环变量”这样经常出现的问题。如果您能够提供一个简短但完整的程序来演示问题,那么诊断将会容易得多。

我建议你创建一个简单的控制台应用程序,试图创建(比方说)5000个序列化一些简单对象的文件。看看你是否能以同样的方式失败。

答案 4 :(得分:0)

多线程可能会导致该问题。 250毫秒的延迟证明了这一点。

你有多个线程吗?