0

次のように機能する必要があるWebサイト(データアクセスにLinq-to-Sqlを使用するAsp.net 3.5)にプロセスがあります。

  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

Try Response.Redirect(url, false) , else the 'Response' will be ended just after that call.

于 2008-09-23T11:31:46.903 に答える