Перехватчик для методов asyn c - PullRequest
0 голосов
/ 21 января 2020

Могу ли я перехватить метод выполнения, если возникает какое-то условие?

Это то, что я хочу сделать:

await Task.Run(() => { Interceptor(); });
await Task.Run(() => { A(); });

private void Interceptor()
{
      //if some condition here, PAUSE whatever is running in A(), do "something" and then re-run A()- wheter where it stopped or re-run the whole method A again
}

private void A()
{
    B();
    C();
    .....
    D();
}

Это то, что я делаю:

await Task.Run(() => { A(); });

private void Interceptor()
{
      if(condition)
      {
           Foo();
      }
}

private void A()
{
    Interceptor();
    B();
    Interceptor();
    C();
    Interceptor();
    .....
    Interceptor();
    D();
    Interceptor();
}

Есть ли способ сделать это? Дело в том, что у меня очень динамический метод c A(), и условие Interceptor может возникнуть в любой точке ... (в том числе внутри методов B, C, D и т. Д.))

1 Ответ

1 голос
/ 21 января 2020

Единственная причина для проверки перехватчика между каждым вызовом метода:

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

В большинстве других сценариев ios это просто пустая трата времени и затрудняет чтение кода.

Если методы в A() асинхронны c, прекратите чтение и используйте вместо этого токен отмены.

Если методы являются синхронными и требуют времени или должны быть прерваны, лучше просто создать конвейер, в котором каждый метод выполняется по очереди:

public static class ExecutionExtensions
{
    public static void Execute(this IEnumerable<Action> pipeline, Func<bool> cancellationFunction)
    {
        foreach (var action in pipeline)
        {
            action();
            if (cancellationFunction())
                break;
        }
    }
}

Затем просто определите поток:

// Requires that the methods are in the same class
var a = new List<Action> { B, C, D, E };

И выполните его:

// interceptor must return true when the execution should be halted.
a.Execute(Interceptor);

Полный код:

public class AClass
{
    private void B()
    {

    }

    private void C()
    {

    }

    private void D()
    {

    }

    private bool Interceptor()
    {
        return false;
    }

    public void A()
    {
        var pipeline = new List<Action> { B, C, D };
        pipeline.Execute(Interceptor);
    }
}
...