проверка состояния c # - PullRequest
       7

проверка состояния c #

0 голосов
/ 25 августа 2011

Мне нужно постоянно проверять состояние. Не в каждой итерации цикла, а во время выполнения функции.

с этим недопустимо:

 while(condition)
 {
      ...
 }

Мне нужно просто прервать функцию даже «в середине» прогресса, когда условие кажется истинным. Есть идеи?

Ответы [ 8 ]

4 голосов
/ 25 августа 2011

Мне нужно просто прервать функцию даже «в середине» прогресса, когда условие кажется истинным. Есть идеи?

Не существует «простого» способа прервать функцию в середине процесса [*], и это хорошо. Прерывание функции в середине может привести к тому, что ваша система будет в несовместимом состоянии (представьте, что прерывание происходит в середине записи файла).

Правильный способ сделать это - определить «безопасные точки» в вашей функции, где возможно прерывание, и выполнить там проверку:

... // some statement

if (condition) return;

... // some more statements

if (condition) return;

...

Сноска: [*] Я лгал, когда сказал, что не существует простого способа прервать функцию. Он есть, и он называется Thread.Abort (для этого вам нужно запустить свою функцию в отдельном потоке и отслеживать condition в другом потоке, обычно в основном потоке пользовательского интерфейса). Однако использование Thread.Abort не рекомендуется по по причинам, указанным выше. Не делай этого.

1 голос
/ 25 августа 2011

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

Но на самом деле более вероятно, что то, что у вас есть / нужно, это фоновый процесс, и что дополнительный проход через цикл не так важен, вам просто нужен способ остановить его, когда условие ALTERNATE выполнено. Для этого, вероятно, ответом будет фоновая тема.

0 голосов
/ 25 августа 2011

Предполагая, что это какое-то условие обработки ошибок, утверждающее. Взгляните на .NET Code Contracts и ContractInvariantMethod, здесь есть хороший пример здесь .

Позволяет определить условия, которые не допускаются, и вызывает утверждение, если это когда-либо происходит во время выполнения.

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

class Account
{
    private int balance

    [ContractInvariantMethod]
    private void BalanceHasToAlwaysBeInTheBlack()
    {
        // Note to reader: only conditions can be in here
        Contract.Invariant(balance >= 0)
    }

    public void Deposit(int amount)
    {
        Contract.Requires(amount > 0)
        Contract.Ensures(balance > amount)   // Note to reader: you can also ensure on the returned object e.g. Contract.Ensures(Contract.Result<int>() > 0)

        balance += amount
    }

    public void Withdraw(int amount)
    {
        Contract.Requires(amount > 0)

        balance -= amount
    }
}
0 голосов
/ 25 августа 2011

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

Однако вы бы оставили систему в неизвестном состоянии, так как Abort() отключает поток мгновенно, так что обычно этоплохая идея.

Лучшим решением, к сожалению, является проверка условий в нескольких местах внутри цикла.

0 голосов
/ 25 августа 2011

Оператор break может вывести вас из цикла.Что касается механизма прослушивания изменения вашего условия, то полагаться на цикл while будет не так эффективно, так как компилятору потребуется достичь конца области видимости, чтобы он мог зарегистрировать, что условие больше не является действительным.

Может быть, вы могли бы создать свой собственный обработчик событий?

0 голосов
/ 25 августа 2011

В C # нет предопределенных конструкций, которые автоматически выполняют то, о чем вы думаете.Не то чтобы я это знал на самом деле.Вы должны реализовать это самостоятельно.

Проверьте состояние в некоторой функции с помощью bool возвращаемого значения.И вызывайте эту функцию в тех местах, где вы хотите проверить ее и проверить, возвращает ли вызов этой функции false (например), после того, как вы можете использовать break, return любые инструкции прерывания выполнения, которые вы хотите (на основе вызоваконтекст).

Надеюсь, это поможет.

0 голосов
/ 25 августа 2011

Вы можете исследовать доходность, как указано здесь http://msdn.microsoft.com/en-us/library/9k7k7cf0(v=vs.80).aspx

0 голосов
/ 25 августа 2011

Используйте оператор break для выхода из цикла.

Если вам необходимо выйти из функции, используйте оператор return.

Из вашего вопроса не совсем ясно, чего именно вы пытаетесь достичь, отсюда и общий ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...