Я могу отменить методы через делегатов в C#

Это - магистраль 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, и т.д.

6
задан Marc Vitalis 11 September 2009 в 10:43
поделиться

3 ответа

Нет - по крайней мере, не чисто. (Я не включаю Thread.Abort как «чистый».) Что вы должны сделать, так это иметь механизм, сообщающий делегату, что вы пытаетесь отменить его. Затем ваш делегат должен будет время от времени проверять этот флаг отмены и реагировать соответствующим образом.

В Parallel Extensions есть встроенная функция отмены повсюду (и, в частности, токены отмены, чтобы разрешить отмену задачи только соответствующими частями кода). Хотя, насколько мне известно, все это по-прежнему кооперативно. Принудительная отмена всегда будет сопряжена с риском повреждения состояния.

9
ответ дан 8 December 2019 в 16:06
поделиться

Как уже сказал Джон, вы не можете сказать нити: «пожалуйста, остановитесь сейчас» и ожидать, что нить будет подчиняться. Thread.Abort не скажет ему остановиться, просто отключит его. :)

Раньше я добавлял серию «if (wehavetostop)» в код потока, и если пользователь нажимал «отменить», я ставил wehavetostop == true.

Это не слишком элегантно, и в некоторых случаях может быть «сложно» поставить проверку «если», особенно если ваш поток выполняет «длинную» операцию, которую вы не можете разделить.

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

1
ответ дан 8 December 2019 в 16:06
поделиться

Вы можете использовать System.ComponentModel.BackgroundWorker . Он поддерживает отмену, поэтому вам не нужно писать шаблонный код. Код клиента может просто вызвать метод CancelAsyn , и вы можете проверить свойство CancellationPending в своем коде, когда и где имеет смысл определить, отменил ли клиент операцию и выйти из нее.

5
ответ дан 8 December 2019 в 16:06
поделиться
Другие вопросы по тегам:

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