答案 0 :(得分:1)
除了我之前添加的一两条评论...... =)
正如您在第3次编辑中注意到的那样,一旦读者处理完毕,您就无法从中获取数据。
您的想法是创建并打开您的连接。在连接打开时尽早获取数据,然后处理拥有数据后使用的所有资源。
在您的情况下,您在readCSV函数中打开和关闭连接,然后将关闭的读取器传递回“StartAsyncTask”。您可以做的事情是稍微重构......而不是使用OleDbDataReader,您可以使用OleDbDataAdapter。使用适配器,您可以调用Fill method来填充数据集。
填充数据集后,它将在内存中。您可以关闭适配器,关闭连接,处置两者('using'语句)并将数据集传递回StartAsync方法?
如果你需要任何这方面的例子,请在这里评论。
祝你好运!编辑:
关于你正在做的多线程工作的快速说明......
关于IIS设置,如果您在多个进程上运行您的网站,请注意在某个阶段您可能有2个进程(或更多)等待文件系统观察程序。当FSW检测到更改时,它将通知您的两个进程;以不可预测的顺序,但可能连续快速,这反过来将导致两个单独的线程开始读取文件。当两个线程请求Jet提供程序同时打开相同的文件时,您可能在此阶段遇到问题。确保你有足够的异常捕获逻辑来帮助。
如果您遇到这种情况,您甚至可能需要考虑使用mutexes,一次允许一个进程处理结果,但我很少鼓励那些。
关于线程异常的注释,看一下我认为在IIS7.5 / .Net 4中仍然适用的this article。对你的工作线程要非常小心,如果没有异常可以取消网站捕获。