Можете ли вы прервать установленную процедуру свойства

StackOverflow https://stackoverflow.com/questions/2282293

Вопрос

Я программирую в C#.NET.Можно ли прервать установленную процедуру свойства класса без создания исключения?

Вот что я хочу сделать...

public int RandomProperty
{
    set
    {
     DialogResult answer = new DialogResult();
     answer = MessageBox.Show("This process could take up to 5 min. Are you sure you want to continue?");
     if(answer = DialogResult.No) 
        CancelSet   // Can I do something similar here?
     else
     {
      ...Do set procedure
     }
    }
}

Я не думаю, что смогу использовать метод (вместо свойства), потому что я устанавливаю это значение с помощью propertygrid .

Это было полезно?

Решение

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

Кроме того, ваш дизайн пользовательского интерфейса плох.Не спрашивайте пользователя заранее "Это может занять некоторое время, вы уверены?", а затем наказывайте его долгим ожиданием, если он нажмет "Да".Вместо этого запустите операцию, и если она не вернется быстро, отобразите элемент пользовательского интерфейса, который показывает индикатор выполнения и предполагаемое оставшееся время, с кнопкой отмены.

Вероятно, вам следует написать свою длительную операцию как асинхронный метод, который может быть полностью отменен в другом потоке.

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

С помощью этой архитектуры вы четко отделяете свою логику пользовательского интерфейса, логику асинхронности и логику бизнес-процесса друг от друга.Это работа, но позже она приносит дивиденды.

Другие советы

ИМО, это просто нехорошо делать - ожидание является ли это, если set не выбрасывает присвоенное ему значение.Тест в пользовательском интерфейсе (или где-либо еще) до того , как выполняя set, или выбросить и обработать исключение.В качестве альтернативы вызывающий мог бы будьте менее сбиты с толку методом:

public bool TrySetRandomProperty(SomeType value) {
    ...
}

который возвращает true или false чтобы указать, произошло ли это.Вам также следует избегать переноса кода пользовательского интерфейса в логику домена;возможно, использовать событие, чтобы позволить пользовательскому интерфейсу общаться с пользователем, не навязывая вызывающему конкретную реализацию пользовательского интерфейса?

Фу.Вы действительно хотите включить пользовательский интерфейс внутри свойства класса?Не следует ли вам сделать эту проверку подробнее в пользовательском интерфейсе?

Вы, конечно, можете закодировать это таким образом, просто не устанавливайте это поле.

Однако у вас очень плохой дизайн, поскольку вы подмешиваете пользовательский интерфейс в свой низкоуровневый код.

Задать вопрос перед настройкой свойства - это один из вариантов.

Просто возвращайтесь со съемочной площадки.Вам придется использовать закрытое поле для хранения значения того, что вы хотите установить, но возврат в "отмена" должен сделать это.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top