Загрузка браузера завершает событие

Я думаю, что Вы были на правильном пути с ManualResetEvent. Этот ссылка имеет пример кода, который тесно соответствует что Вашу попытку сделать. Ключ должен использовать WaitHandle. WaitAll и передача массив событий ожидания. Каждый поток должен установить один из них, ожидают события.

   // Simultaneously calculate the terms.
    ThreadPool.QueueUserWorkItem(
        new WaitCallback(CalculateBase));
    ThreadPool.QueueUserWorkItem(
        new WaitCallback(CalculateFirstTerm));
    ThreadPool.QueueUserWorkItem(
        new WaitCallback(CalculateSecondTerm));
    ThreadPool.QueueUserWorkItem(
        new WaitCallback(CalculateThirdTerm));

    // Wait for all of the terms to be calculated.
    WaitHandle.WaitAll(autoEvents);

    // Reset the wait handle for the next calculation.
    manualEvent.Reset();

Редактирование:

Удостоверяются, что в Вашем пути выполнения кода рабочего потока Вы устанавливаете событие (т.е. автособытия 1 .Set () ;). После того как они все сообщены, waitAll возвратится.

void CalculateSecondTerm(object stateInfo)
{
    double preCalc = randomGenerator.NextDouble();
    manualEvent.WaitOne();
    secondTerm = preCalc * baseNumber * 
        randomGenerator.NextDouble();
    autoEvents[1].Set();
}

13
задан laura 6 October 2009 в 09:25
поделиться

6 ответов

Вы не можете знать, если не получите ошибку сети. Единственный способ - заставить браузер отправлять второе событие на сервер (используя AJAX), чтобы подтвердить, что загрузка была успешно завершена.

3
ответ дан 2 December 2019 в 00:18
поделиться

Даже несмотря на то, что файлы маленькие, если вы используете метод setContentLength из ServletResponse , пользователь сможет различать ошибку и хороший загрузите, и менеджер загрузки их браузера сообщит им, когда он будет завершен.

1
ответ дан 2 December 2019 в 00:18
поделиться

Вы можете получить довольно хорошее представление о сервере, который напрямую подключен к браузеру (конечная точка TCP-соединения). Сервер получит ошибку ввода-вывода, когда пользователь отменяет загрузку или сталкивается с какой-либо сетевой проблемой. Так что если вы можете запустить сервер напрямую (без прокси). Вы можете сделать что-то вроде этого,

  try {
      response.setContentType("application/pdf");
      response.setContentLength(bytes.length);
      ServletOutputStream ouputStream = response.getOutputStream();
      ouputStream.write(bytes, 0, bytes.length);
      ouputStream.flush();
      ouputStream.close();
      logger.info("PDF " + fileName + " sent successfully");
  } catch (Exception e) {
      logger.error("PDF " + fileName + " error: " + e.getMessage());
      throw e;
  }

Однако есть еще небольшая вероятность, что пользователь может не увидеть PDF-файл в браузере после успешной загрузки. ACK из браузера будет лучшим подходом. Вы не можете этого сделать, если PDF-файл отображается непосредственно браузером. Вы должны использовать какую-то программу просмотра PDF-файлов Javascript и добавлять обратный вызов серверу, когда он отображается.

8
ответ дан 2 December 2019 в 00:18
поделиться

Браузер изначально не обрабатывает это, но вы можете использовать шестеренки Google для обработки запроса на загрузку (это вызовет событие успеха, когда загрузка будет завершена).

http: // code.google.com/apis/gears/api_httprequest.html[1290 visible

1
ответ дан 2 December 2019 в 00:18
поделиться

Отмена пользователя может иногда обнаруживаться в сервлете. Например, с помощью Tomcat попробуйте передать клиенту большой файл в потоковом режиме, а затем отмените загрузку. Вы можете увидеть трассировку стека исключения в logs / catalona.out. Однако я не уверен, что с этим можно справиться в самом сервлете или на более низком уровне (внутри catalina).

Существует подход с предварительной загрузкой (конечно, с помощью средства прослушивателя событий ), который обычно используется для загрузки изображений. Браузер должен загружать весь PDF-файл или нет, если он определяет его как неподдерживаемое изображение, но попробовать стоит. Здесь является примером.

Другим решением может быть неявная загрузка PDF-файла с использованием тегов или и их события onload. слушатель. Не то чтобы это работает только в том случае, если в браузере выполняется ActiveX или какая-то ассоциация файлов PDF, и, вероятно, не будет работать, если у пользователя нет программы просмотра PDF. Вот пример, демонстрирующий это (см. Вспомогательное решение: 21.11.04, 08:22, ID: 12638846).

Mohsen

2
ответ дан 2 December 2019 в 00:18
поделиться

Если вы можете вставить поле изображения в свои документы, href изображения может указывать на ваш сервер, чтобы подтвердить, что пользователь открыл PDF-документ.

Я не пробовал это я, но просмотр последней страницы этого документа Adobe кажется возможным.

Если вы используете Itext, он не поддерживает поля изображений, но вы можете использовать шаблон PDF с полем изображения для создания своего документы и добавьте javascript, чтобы присвоить URL-адрес полю изображения.

0
ответ дан 2 December 2019 в 00:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: