從不同的線程訪問文件我有一個網站的過程(使用Asp.net 3.5 LINQ到SQL進行數據存取),需要的工作方式如下:問題在Asp.net
- 上傳文件
- 記錄並保存信息有關文件,從數據庫文件
- 將數據導入到數據庫
- 重定向到不同的頁面
運行時順序像這樣,一切正常。但是,由於被導入的文件可能非常大,我希望第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
}
}
謝謝!這總是最簡單的事情...... – 2008-09-23 11:43:15