Я создал функцию с «пока», чтобы определить текущую страницу или состояние приложения, определяя следующее действие. выполнить.
void OuterMostFunc()
{
while(!exit)
{
//InitSomethings...
InnerFunc();
//HandleSomethings...
Thread.Sleep(milliseconds);
}
}
void InnerFunc()
{
if(A_Page_Cond)
A_Func();
else if(B_Page_Cond)
B_Func();
...
}
Однако в то же время этими приложениями можно управлять вручную или сталкиваться с неожиданными событиями, приводящими к изменению страницы или состояния.
Поэтому я должен проверять изменения статуса на многих клавишах. точки и прорыв, чтобы вернуться к самой внешней функции для переоценки ситуации.
Относительно элегантное решение — использовать Try-Catch вместе с настройкой BreakException, что позволяет мне вернуться к самой внешней функции из любого места кода.
Кроме того, я сбрасываю все важные переменные на самом внешнем уровне, поэтому мне не нужно беспокоиться о проблемах, вызванных прерываниями.
void OuterMostFunc()
{
while(!exit)
{
//InitSomethings...
try
{
InnerFunc();
}
catch(BreakExcetion ex)
{}
//HandleSomethings...
Thread.Sleep(milliseconds);
}
}
void Any_Deep_Level_Func()
{
//DoSomethings.
if(CheckPageIsChanged())
throw new BreakException();
//DoSomethings.
}
В течение долгого времени этот подход был полезным и надежным.
Однако из-за того, что контекст приложения программы требует максимальной скорости, накладные расходы на производительность, вызванные Try-Catch, становятся трудными. игнорировать.
Например, Try-Catch требует десятков миллисекунд времени выполнения и создает относительно значительную нагрузку на процессор».
Если бы каждая функция возвращала bool (или вывод bool), а затем мы проверяли, следует ли возвращать или выполнять следующий шаг после вызова каждой функции, это действительно позволило бы нам быстро вернуться к самой внешней функции.
Однако такой подход, похоже, создает катастрофу для читаемости кода. кода, особенно учитывая фактическую сложность и многоуровневость функций, вызываемых в программе.
Дополнительное примечание:
- Например, мне может потребоваться выполнить ряд действий на странице А, но перед выполнением определенных важных шагов мне нужно будет еще раз проверить что-то, чтобы увидеть, произошли ли какие-либо изменения.
- Моя программа создает несколько потоков, каждый из которых выполняет OuterMostFunc для отдельных приложений.
- Приоритетом является скорость, с которой программа выполняет соответствующие операции после изменения состояния, при этом производительность вторична .
Процесс требует, чтобы внутренние функции проверяли изменения состояния и принимали решение об отмене или отмене. вместо проверки внешнего уровня и отмены вызова.
Это связано с тем, что он включает в себя операции над другими приложениями, и выдача инструкций из внешнего уровня во время выполнения внутренней функции может вызвать конфликты.
Это многоуровневая проверка подход считается более чистым? (Предполагаем, что мы сейчас не обсуждаем проблемы асинхронности и циклов while.)
void OuterMostFunc()
{
while (!exit)
{
//InitSomethings...
CancellationTokenSource cts = new CancellationTokenSource();
DirectingFunc(cts);
//HandleSomethings...
}
}
void DirectingFunc(CancellationTokenSource cts)
{
if(A_Page_Cond)
A_Func(cts);
else if(B_Page_Cond)
B_Func(cts);
}
void A_Func(CancellationTokenSource cts)
{
//DoSomethings.
A_Inner_Func(cts);
if (cts.IsCancellationRequested)
return;
//DoSomethings.
}
void A_Inner_Func(CancellationTokenSource cts)
{
//DoSomethings.
A_Inner_Inner_Func(cts);
if (cts.IsCancellationRequested)
return;
//DoSomethings.
}
void A_Inner_Inner_Func(CancellationTokenSource cts)
{
//DoSomethings.
if (CheckPageIsChanged())
{
cts.Cancel();
return;
}
//DoSomethings.
}
Подробнее здесь: https://stackoverflow.com/questions/784 ... erformance
Мобильная версия