Проблема доступа к файлу из другого потока в Asp.net - PullRequest
0 голосов
/ 23 сентября 2008

У меня есть процесс на веб-сайте (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
  }
}

Ответы [ 2 ]

1 голос
/ 23 сентября 2008

Попробуйте Response.Redirect (url, false), иначе «Ответ» будет завершен сразу после этого вызова.

0 голосов
/ 11 ноября 2009

Состояние просмотра ASP.NET - отличная функция и важный инструмент для веб-разработки сегодня. Он поддерживает состояние страницы при перемещении туда и обратно. Больше нет необходимости беспокоиться о восстановлении значений элементов управления страницы между постбэками. В этой статье вы получите подробное представление о состоянии просмотра. Мы поговорим о способах уменьшения ненужной полезной нагрузки и защиты состояния просмотра от посторонних глаз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...