Этот thread.abort () нормален и безопасен?

Не рассматривая другие ответы, я думаю, что заслуживает упоминания следующее.

  1. Обозначение «long» (http-equiv) и «короткое» равно, в зависимости от того, что произойдет первые выигрыши;
  2. Заголовки веб-серверов будут переопределять все теги <meta>;
  3. BOM (знак байтового байта) переопределит все и во многих случаях это повлияет на html 4 (и, возможно, на другие вещи тоже);
  4. Если вы не объявляете какую-либо кодировку, вы, вероятно, получите текст в «резервной кодировке текста», который определяется вашим браузером. Ни в Firefox, ни в Chrome это utf-8;
  5. В отсутствие других подсказок браузер попытается прочитать ваш документ, как если бы он был в ASCII, чтобы получить кодировку, поэтому вы не можете использовать какие-либо странные кодировки (utf-16 с спецификацией должен делать, хотя);
  6. Хотя в спецификациях утверждается, что объявление кодирования должно быть в первых 512 байтах документа, большинство браузеров попытаются прочитать больше этого.

Вы можете протестировать, запустив echo 'HTTP/1.1 200 OK\r\nContent-type: text/html; charset=windows-1251\r\n\r\n\xef\xbb\xbf<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><meta charset="windows-1251"><title>привет</title></head><body>привет</body></html>' | nc -lp 4500 и указав свой браузер на localhost:4500. (Конечно, вы захотите изменить или удалить части. Часть спецификации - \xef\xbb\xbf. Будьте осторожны с кодировкой вашей оболочки.)

Имейте в виду, что очень важно, чтобы вы явно объявляли кодировку. Разрешение браузерам может привести к проблемам безопасности.

20
задан Michael Buen 7 January 2009 в 20:56
поделиться

4 ответа

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

Настроенный таймер. Ожидайте немного после текстового изменения прежде, чем позвонить делегату. Затем ожидайте его для возврата прежде, чем назвать его снова. Если это будет , что медленный, или пользователь вводит , что быстрый, то они, вероятно, не ожидают автоматическое заполнение так или иначе.

Относительно Вашего обновленного (Аварийное прекращение работы () - свободный) код:

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

я затронул это ранее, но Папа P сказал это лучше :

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

Думают об этом: быстрая машинистка могла бы создать счет потоков, прежде чем первый обратный вызов автоматического заполнения имел шанс закончиться, даже с быстрым соединением с быстрой базой данных. Но если Вы задерживаете выполнение запроса до короткого промежутка времени после того, как последнее нажатие клавиши протекло, затем у Вас есть лучший шанс удара той зоны наилучшего восприятия, где пользователь ввел все, к чему они хотят (или все, что они знают!) и всего запуск ожидать автоматического заполнения для умирания. Игра с задержкой - полусекунда могла бы подходить для нетерпеливых машинисток, но если Ваши пользователи немного более ослабляются..., или Ваша база данных является немного более медленной... затем, можно получить лучшие результаты с 2-3 вторыми задержками, или еще дольше. Самая важная часть этой техники, хотя, то, что Вы reset the timer on every keystroke.

И если Вы не ожидаете, запросы к базе данных к на самом деле зависают , не потрудитесь пытаться позволить несколько параллельных запросов. Если запрос в настоящее время происходит, ожидайте его для завершения прежде, чем сделать другой.

31
ответ дан 29 November 2019 в 23:20
поделиться

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

11
ответ дан 29 November 2019 в 23:20
поделиться

Вы могли бы хотеть взглянуть на Введение в Программирование с Потоками C# - Andrew D. Birrell. Он обрисовывает в общих чертах часть поточной обработки окружения лучших практик в C#.

страница 4 On он говорит:

, Когда Вы смотрите на “System. Пространство имен Threading”, Вы будете (или если) чувствуют себя укрощенными диапазоном выбора, стоящим перед Вами: “Monitor” или “Mutex”; “Wait” или “AutoResetEvent”; “Interrupt” или “Abort”? К счастью, there’s простой ответ: используйте оператор “lock”, класс “Monitor” и метод “Interrupt”. Это - функции, которые I’ll используют для большей части остальной части бумаги. На данный момент необходимо проигнорировать остальную часть “System. Threading”, хотя I’ll обрисовывают в общих чертах это для Вас, разделяют 9.

4
ответ дан 29 November 2019 в 23:20
поделиться

Нет, я избежал бы когда-либо вызывающего потока. Прервитесь на своем собственном коде. Вы хотите, чтобы Ваш собственный фоновый поток обычно завершался и раскручивал свой стек естественно. Единственное время я мог бы рассмотреть вызывающий поток. Аварийное прекращение работы находится в сценарии, где мой код размещает внешний код другого потока (такого как сменный сценарий), и я действительно хочу прервать внешний код.

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

3
ответ дан 29 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

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