Я думаю, что Вы были на правильном пути с 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();
}
Вы не можете знать, если не получите ошибку сети. Единственный способ - заставить браузер отправлять второе событие на сервер (используя AJAX), чтобы подтвердить, что загрузка была успешно завершена.
Даже несмотря на то, что файлы маленькие, если вы используете метод setContentLength
из ServletResponse
, пользователь сможет различать ошибку и хороший загрузите, и менеджер загрузки их браузера сообщит им, когда он будет завершен.
Вы можете получить довольно хорошее представление о сервере, который напрямую подключен к браузеру (конечная точка 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 и добавлять обратный вызов серверу, когда он отображается.
Браузер изначально не обрабатывает это, но вы можете использовать шестеренки Google для обработки запроса на загрузку (это вызовет событие успеха, когда загрузка будет завершена).
http: // code.google.com/apis/gears/api_httprequest.html[1290 visible
Отмена пользователя может иногда обнаруживаться в сервлете. Например, с помощью Tomcat попробуйте передать клиенту большой файл в потоковом режиме, а затем отмените загрузку. Вы можете увидеть трассировку стека исключения в logs / catalona.out. Однако я не уверен, что с этим можно справиться в самом сервлете или на более низком уровне (внутри catalina).
Существует подход с предварительной загрузкой (конечно, с помощью средства прослушивателя событий ), который обычно используется для загрузки изображений. Браузер должен загружать весь PDF-файл или нет, если он определяет его как неподдерживаемое изображение, но попробовать стоит. Здесь является примером.
Другим решением может быть неявная загрузка PDF-файла с использованием тегов
или
и их события onload. слушатель. Не то чтобы это работает только в том случае, если в браузере выполняется ActiveX или какая-то ассоциация файлов PDF, и, вероятно, не будет работать, если у пользователя нет программы просмотра PDF. Вот пример, демонстрирующий это (см. Вспомогательное решение: 21.11.04, 08:22, ID: 12638846).
Mohsen
Если вы можете вставить поле изображения в свои документы, href изображения может указывать на ваш сервер, чтобы подтвердить, что пользователь открыл PDF-документ.
Я не пробовал это я, но просмотр последней страницы этого документа Adobe кажется возможным.
Если вы используете Itext, он не поддерживает поля изображений, но вы можете использовать шаблон PDF с полем изображения для создания своего документы и добавьте javascript, чтобы присвоить URL-адрес полю изображения.