次のように機能する必要があるWebサイト(データアクセスに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
  }
}