Не рассматривая другие ответы, я думаю, что заслуживает упоминания следующее.
http-equiv
) и «короткое» равно, в зависимости от того, что произойдет первые выигрыши; <meta>
; Вы можете протестировать, запустив 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
. Будьте осторожны с кодировкой вашей оболочки.)
Имейте в виду, что очень важно, чтобы вы явно объявляли кодировку. Разрешение браузерам может привести к проблемам безопасности.
Нет, это не безопасно. Thread.Abort()
является достаточно поверхностным в лучшие времена, но в этом случае Ваше управление не имеет никакого (heh) управление тем, что делается в обратном вызове делегата. Вы не знаете, какая остальная часть состояния приложения будет оставлена внутри и может оказаться в мире вреда, когда время явится по зову делегат снова.
Настроенный таймер. Ожидайте немного после текстового изменения прежде, чем позвонить делегату. Затем ожидайте его для возврата прежде, чем назвать его снова. Если это будет , что медленный, или пользователь вводит , что быстрый, то они, вероятно, не ожидают автоматическое заполнение так или иначе.
Вы теперь запускаете новый поток для (потенциально) каждое нажатие клавиши . Это не только собирается уничтожить производительность, является ненужным - если пользователь не приостанавливается, они, вероятно, не ищут управление для завершения то, что они вводят.
я затронул это ранее, но Папа P сказал это лучше :
Вы были бы более обеспечены просто реализация одноразового таймера с, возможно, полувторым тайм-аутом и сбросом его на каждом нажатии клавиши.
Думают об этом: быстрая машинистка могла бы создать счет потоков, прежде чем первый обратный вызов автоматического заполнения имел шанс закончиться, даже с быстрым соединением с быстрой базой данных. Но если Вы задерживаете выполнение запроса до короткого промежутка времени после того, как последнее нажатие клавиши протекло, затем у Вас есть лучший шанс удара той зоны наилучшего восприятия, где пользователь ввел все, к чему они хотят (или все, что они знают!) и всего запуск ожидать автоматического заполнения для умирания. Игра с задержкой - полусекунда могла бы подходить для нетерпеливых машинисток, но если Ваши пользователи немного более ослабляются..., или Ваша база данных является немного более медленной... затем, можно получить лучшие результаты с 2-3 вторыми задержками, или еще дольше. Самая важная часть этой техники, хотя, то, что Вы reset the timer on every keystroke
.
И если Вы не ожидаете, запросы к базе данных к на самом деле зависают , не потрудитесь пытаться позволить несколько параллельных запросов. Если запрос в настоящее время происходит, ожидайте его для завершения прежде, чем сделать другой.
Там многие предупреждения на всем протяжении сеть об использовании Thread.Abort
. Я рекомендовал бы избежать его, если это не действительно необходимо, который в этом случае, я не думаю, что это. Вы были бы более обеспечены просто реализация одноразового таймера с, возможно, полувторым тайм-аутом и сбросом его на каждом нажатии клавиши. Таким образом, Ваша дорогая операция только произошла бы после полусекунды или больше (или безотносительно длины Вы выбираете) пользовательской неактивности.
Вы могли бы хотеть взглянуть на Введение в Программирование с Потоками 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.
Нет, я избежал бы когда-либо вызывающего потока. Прервитесь на своем собственном коде. Вы хотите, чтобы Ваш собственный фоновый поток обычно завершался и раскручивал свой стек естественно. Единственное время я мог бы рассмотреть вызывающий поток. Аварийное прекращение работы находится в сценарии, где мой код размещает внешний код другого потока (такого как сменный сценарий), и я действительно хочу прервать внешний код.
Вместо этого в этом случае, Вы могли бы считать просто управление версиями каждым фоновым запросом. В обратном вызове проигнорируйте ответы, которые являются "устаревшими", так как ответы сервера могут возвратиться в неправильном порядке. Я не волновался бы слишком много о прерывании запроса, который это было уже отправлено в базу данных. Если Вы находите, что Ваша база данных не является быстро реагирующей или разбивается слишком многими запросами, то рассмотрите также использование таймера, как другие предположили.