C# async -функция обратного вызова [закрыто]C#

Место общения программистов C#
Ответить
Anonymous
 C# async -функция обратного вызова [закрыто]

Сообщение Anonymous »

Мне было интересно, как я могу написать асинхронную функцию, используя класс задач C#, который ведет себя как машина состояния, когда она выполняет функцию такой же пример (). Он выполнит следующий способ: < /p>

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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»