从不同的线程访问文件我有一个网站的过程(使用Asp.net 3.5 LINQ到SQL进行数据存取),需要的工作方式如下:问题在Asp.net
- 上传文件
- 记录并保存信息有关文件,从数据库文件
- 将数据导入到数据库
- 重定向到不同的页面
运行时顺序像这样,一切正常。但是,由于被导入的文件可能非常大,我希望第3步在UI线程的不同线程上运行。用户应该在步骤3仍在进行时进入步骤4,并且步骤4中的屏幕将定期更新以让用户知道何时导入完成。
我处理的线程如下:
public class Import {
public static void ImportPendingFile() {
Import i = new Import();
Thread newThread = new Thread(new ThreadStart(i.ImportFile));
newThread.Start();
}
public void ImportFile() {
// 1. Query DB to identify pending file
// 2. Open up and parse pending file
// 3. Import all data from file into DB
// 4. Update db to reflect that import completed successfully
}
}
而在代码隐藏:
protected void butUpload(object sender, EventArgs e) {
// Save file, prepare for import
Import.ImportPendingFile();
Response.Redirect(NewLocation);
}
做这件事时,我能够通过调试程序,以确认新的线程正确启动。但是,每当我这样做时,线程在尝试访问文件时都会中止(后面的代码中的第2步)。这在主线程中运行时工作正常,所以关于多线程情况的一些事情阻止了这一点。我曾经想过,因为文件被保存到磁盘(它是),在不同的线程中打开它应该没有任何问题。任何想法,我已经出错了,我该如何解决它?谢谢!
注意:我正在使用第三方程序集打开文件。使用反射,我发现与此相关的是如何打开了该文件的下面的代码:
if (File.Exists(fileName)) {
using (FileStream stream = new FileStream(fileName, FileMode.Open)) {
// use stream to open file
}
}
谢谢!这总是最简单的事情...... – 2008-09-23 11:43:15