0

我在网站中有一个进程(Asp.net 3.5 使用 Linq-to-Sql 进行数据访问),需要按如下方式工作:

  1. 上传文件
  2. 记录并保存有关文件的信息到数据库
  3. 将文件中的数据导入数据库
  4. 重定向到不同的页面

当像这样顺序运行时,一切正常。但是,由于导入的文件可能非常大,我希望第 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
  }
}
4

1 回答 1

1

尝试 Response.Redirect(url, false) ,否则“响应”将在该调用之后结束。

于 2008-09-23T11:31:46.903 回答