我有一个网页,用户可以一次上传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处理方法所做的事情不是线程安全的,但我不知道那可能是什么,并且没有错误发生在那里。这两个方法位于同一个类文件中,但是线程确实启动了文件中的正确方法。