线程处理反序列化的xml文件在单独的线程中关闭MemoryStream

时间:2018-06-01 11:35:09

标签: .net xml multithreading csv

我有一个网页,用户可以一次上传1,2或3个文件。三个文件中有两个是csv,一个是xml文件。在处理之前将csv文件转换为MemoryStreams,并将xml文件反序列化为我构建的类结构。

为了处理每个文件,我开始使用单独的线程,因为文件需要相当多的时间才能上传。

单独上传xml文件有效。上传一个或两个csv文件的工作原理。但是,当我上传xml文件和csv文件的任意组合时,我收到错误“无法访问已关闭的文件”。在运行csv文件的线程中。

奇怪的是,我测试过的每个csv文件都会在同一行的同一行中出现此错误。我已经验证问题不是行本身,如前所述,上传没有xml文件的csv文件可以正常工作。我的代码如下。

启动csv线程的代码。

var csvThread = new Thread(() => ProcessThread(threadModel, identity, 2));
csvThread.Start();

启动xml线程的代码。

var xmlThread = new Thread(() => ProcessThread(threadModel, identity, 1));
xmlThread.Start();

进程线程方法。

private void ProcessThread(ThreadModel threadModel, int i)
{
    if (i == 2)
    {
        _file.ProcessCsvStream(threadModel.Stream, threadModel.RecordSource);
    }
    if (i == 1)
    {
       _file.ProcessXmlStream(threadModel.XmlModel, threadModel.RecordSource);
    }

发生故障的ProcessCsvStream方法。

public void ProcessCsvStream(Stream dataStream, RecordSource recordSource)
{
    dataStream.Seek(0, 0);
    var insertCounter = 0;

    using (TextFieldParser csvParser = new TextFieldParser(dataStream))
    {
        csvParser.CommentTokens = new string[] {"#"};
        csvParser.SetDelimiters(new string[] {","});
        csvParser.HasFieldsEnclosedInQuotes = true;

        // Skip the row with the column names
        csvParser.ReadLine();

        while (!csvParser.EndOfData) //<-- This is where I get the "Cannot access a closed file." error.
        {
            //Do stuff
        }

我尝试了很多东西,包括:

将csv流作为Stream.Synchronized传递。 将所有内容作为ref变量传递。 睡觉处理xml节点的方法。

我确信xml处理方法所做的事情不是线程安全的,但我不知道那可能是什么,并且没有错误发生在那里。这两个方法位于同一个类文件中,但是线程确实启动了文件中的正确方法。

0 个答案:

没有答案