У меня есть процесс на веб-сайте (Asp.net 3.5 использует Linq-to-Sql для доступа к данным), который должен работать следующим образом:
- Загрузить файл
- Запись и сохранение информации о файле в базе данных
- Импорт данных из файла в базу данных
- Перенаправление на другую страницу
При последовательном запуске все работает нормально. Однако, поскольку импортируемые файлы могут быть довольно большими, я бы хотел, чтобы шаг 3 выполнялся в потоке, отличном от потока пользовательского интерфейса. Пользователь должен перейти к шагу 4, пока шаг 3 все еще выполняется, и экран на шаге 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
}
}