anvest () -> выполнить некоторые функции по адресу _state 0 -> ждать 1 сек после выполнения < /p>
< /li>
Пример вызова () -> выполнить некоторые другие функции at _state 1 -> wait 2 sec (a wait 2 sec. /> Пример Call () -> ничего не делай, ничего не подожди в default -> example () никогда не вызывается снова из функции Async после достижения по умолчанию < /p>
< /li>
Пользователь может отменить задачу Async на любом _state (поэтому, если задача будет отменена в _state 0, он никогда не будет пытаться выполнить функцию. /> < /li>
< /ul>
Код: Выделить всё
public class ExampleClass
{
private StateMachine stateMachine;
public ExampleClass()
{
stateMachine = new StateMachine();
}
public void OnClick()
{
stateMachine.Start((Action)Example, 3);
}
public void OnCancel()
{
stateMachine.Cancel();
}
private void Example(int state)
{
switch(state)
{
case 0:
Function1();
break;
case 1:
Function2();
break;
default:
break;
}
}
private void Function1()
{
}
private void Function2()
{
}
}
public class StateMachine
{
private CancellationTokenSource tokenSource;
private int numOfStates;
private int stateIndex;
public async void Start(Delegate f, int states)
{
numOfStates = states;
stateIndex = 0;
tokenSource = new CancellationTokenSource();
await Task.WhenAll(Execute(f));
}
private async Task Execute(Delegate f)
{
try
{
await Task.Delay(1000, tokenSource.Token);
}
catch (OperationCanceledException) when (tokenSource.IsCancellationRequested)
{
await Task.Yield();
return;
}
if (stateIndex < numOfStates - 1)
{
f.DynamicInvoke(stateIndex);
stateIndex++;
await Execute(f);
}
else
{
await Task.Yield();
}
}
public void Cancel()
{
tokenSource.Cancel();
}
Подробнее здесь: https://stackoverflow.com/questions/797 ... -execution
Мобильная версия