Asp.net の別のスレッドからファイルにアクセスする際の問題
-
02-07-2019 - |
質問
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
}
}
解決
Response.Redirect(url, false) を試してください。そうしないと、その呼び出しの直後に「Response」が終了します。
他のヒント
ASP.NET ビュー ステートは優れた機能であり、今日の Web 開発にとって不可欠なツールです。ページが前後に移動しても、ページの状態が維持されます。ポストバック間のページ コントロールの値の復元について心配する必要はもうありません。この記事では、ビューステートについて詳しく説明します。不要なペイロードを削減し、ビューステートを覗き見から保護する方法について説明します。