Проблема с доступом к файлу из другого потока в Asp.net

StackOverflow https://stackoverflow.com/questions/120404

Вопрос

У меня есть процесс на веб-сайте (Asp.net 3.5, использующий Linq-to-Sql для доступа к данным), который должен работать следующим образом:

  1. Загрузить файл
  2. Запишите и сохраните информацию о файле в базе данных.
  3. Импортировать данные из файла в базу данных
  4. Перенаправление на другую страницу

При таком последовательном запуске все работает нормально.Однако, поскольку импортируемые файлы могут быть довольно большими, я бы хотел, чтобы шаг 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 — замечательная функция и важный инструмент для современной веб-разработки.Он поддерживает состояние страницы при ее перемещении вперед и назад.Больше не нужно беспокоиться о восстановлении значений элементов управления страницы между обратными передачами.В этой статье вы получите более подробную информацию о состоянии просмотра.Мы поговорим о способах уменьшения ненужной полезной нагрузки и защиты состояния просмотра от посторонних глаз.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top