Это - магистраль CSS, "каскада" в Расположение каскадом Таблицы стилей.
, Если Вы пишете свои правила CSS в одной строке, она помогает видеть структуру:
.area1 .item { color:red; }
.area2 .item { color:blue; }
.area2 .item span { font-weight:bold; }
Используя несколько классов также хорошее промежуточное/усовершенствованное использование CSS, к сожалению, существует известная ошибка IE6, которая ограничивает это использование при написании перекрестного кода браузера:
<div class="area1 larger"> .... </div>
.area1 { width:200px; }
.area1.larger { width:300px; }
IE6 ИГНОРИРУЕТ первый селектор в правиле мультикласса, таким образом, IE6 на самом деле применяет правило .area1.larger как
/*.area1*/.larger { ... }
Значение, что это будет влиять на ВСЕ .larger элементы.
Это - очень противная и неудачная ошибка (один из многих) в IE6, который вынуждает Вас к в значительной степени, никогда не используют ту функцию CSS, если Вы хотите один чистый перекрестный браузер файл CSS.
решение затем состоит в том, чтобы использовать префиксы имени класса CSS, чтобы не сталкиваться с универсальными именами классов:
.area1 { ... }
.area1.area1Larger { ... }
.area2.area2Larger { ... }
May также использует всего один класс, но тот способ, которым можно сохранить CSS в логике, которую Вы предназначили при знании, что .area1Larger только влияет на .area1, и т.д.
Нет - по крайней мере, не чисто. (Я не включаю Thread.Abort
как «чистый».) Что вы должны сделать, так это иметь механизм, сообщающий делегату, что вы пытаетесь отменить его. Затем ваш делегат должен будет время от времени проверять этот флаг отмены и реагировать соответствующим образом.
В Parallel Extensions есть встроенная функция отмены повсюду (и, в частности, токены отмены, чтобы разрешить отмену задачи только соответствующими частями кода). Хотя, насколько мне известно, все это по-прежнему кооперативно. Принудительная отмена всегда будет сопряжена с риском повреждения состояния.
Как уже сказал Джон, вы не можете сказать нити: «пожалуйста, остановитесь сейчас» и ожидать, что нить будет подчиняться. Thread.Abort не скажет ему остановиться, просто отключит его. :)
Раньше я добавлял серию «if (wehavetostop)» в код потока, и если пользователь нажимал «отменить», я ставил wehavetostop == true.
Это не слишком элегантно, и в некоторых случаях может быть «сложно» поставить проверку «если», особенно если ваш поток выполняет «длинную» операцию, которую вы не можете разделить.
Если вы пытаетесь установить сетевое соединение (а это требует времени), и вы действительно думаете, что "ненормальное" завершение потока не вызовет какого-либо состояния повреждения, вы можете использовать его, но помните, что вы не можете доверять состоянию вещей, которые были задействованы в этой цепочке.
Вы можете использовать System.ComponentModel.BackgroundWorker . Он поддерживает отмену, поэтому вам не нужно писать шаблонный код. Код клиента может просто вызвать метод CancelAsyn , и вы можете проверить свойство CancellationPending в своем коде, когда и где имеет смысл определить, отменил ли клиент операцию и выйти из нее.