質問

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
  }
}
役に立ちましたか?

解決

Response.Redirect(url, false) を試してください。そうしないと、その呼び出しの直後に「Response」が終了します。

他のヒント

ASP.NET ビュー ステートは優れた機能であり、今日の Web 開発にとって不可欠なツールです。ページが前後に移動しても、ページの状態が維持されます。ポストバック間のページ コントロールの値の復元について心配する必要はもうありません。この記事では、ビューステートについて詳しく説明します。不要なペイロードを削減し、ビューステートを覗き見から保護する方法について説明します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top