次のように機能する必要がある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
}
}