Проблема с доступом к файлу из другого потока в Asp.net
-
02-07-2019 - |
Вопрос
У меня есть процесс на веб-сайте (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
}
}
Решение
Попробуйте Response.Redirect(url, false) , иначе «Ответ» завершится сразу после этого вызова.
Другие советы
Состояние представления ASP.NET — замечательная функция и важный инструмент для современной веб-разработки.Он поддерживает состояние страницы при ее перемещении вперед и назад.Больше не нужно беспокоиться о восстановлении значений элементов управления страницы между обратными передачами.В этой статье вы получите более подробную информацию о состоянии просмотра.Мы поговорим о способах уменьшения ненужной полезной нагрузки и защиты состояния просмотра от посторонних глаз.