从Asp.net中的其他线程访问文件时出现问题

时间:2020-03-06 14:35:34  来源:igfitidea点击:

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

  • 上传文件
  • 记录有关文件的信息并将其保存到数据库
  • 将数据从文件导入数据库
  • 重定向到其他页面

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

解决方案

尝试Response.Redirect(url,false),否则" Response"将在该调用后立即结束。

ASP.NET视图状态是当今Web开发的一项重要功能,也是一项必不可少的工具。当页面来回移动时,它保持页面的状态。无需担心在回发之间恢复页面控件的值。在本文中,我们将深入了解视图状态。我们将讨论减少不必要的有效载荷并保护视图状态不被窥视的方法。