Вызов Asyn c методов в Syn c Interceptors - PullRequest
0 голосов
/ 03 мая 2020

В нашем веб-API мы используем прокси-перехватчики Castle Dynami c. Они отлично подходят для синхронного, но, похоже, они не решают асин c методы / проблемы, потому что они имеют только перехватчик syn c. Ниже приведен код, который мы добавили для асинхронных c методов из их проблем с Github

// Following is the code suggested by autofac or castle team in Github issues
public void Intercept(IInvocation invocation){
     invocation.Proceed();
     if (invocation.ReturnValue is Task)
     {
       Task t = invocaion.ReturnValue as Task;
       t.ContinueWith(x => { }, TaskContinuationOptions.OnlyOnRanToCompletion);
       t.ContinueWith(x => { }, TaskContinuationOptions.OnlyOnFaulted);
     }
}

Но вышеупомянутый подход будет выполняться в отдельном потоке, если есть исключение или результат. Поскольку это задача продолжения, мы не можем контролировать исходный поток. Таким образом, в исходном коде, если выдается исключение, он входит в блок catch, и поток продолжается, и эти continueWith on faulted будут выполняться для своей собственной задачи. Что делать, если я хочу повторить метод, поскольку он неисправен. Мы не можем этого достичь, потому что поток находится в отдельном потоке. Ниже мы добавили фрагмент кода

public virtual void Intercept(IInvocation invocation)
{
     invocation.Proceed();
     if (invocation.ReturnValue is Task)
     {
       dynamic t = invocaion.ReturnValue;
       t.Result;
     }
}

. Это прекрасно работает и делает все синхронно. Единственный вопрос, который у нас есть, эта строка t.Result создаст какие-либо проблемы с производительностью, поскольку мы блокируем поток? Мы используем веб-API, это окажет какое-либо влияние на производительность на количество обслуживаемых запросов. Я знаю, что в пользовательском интерфейсе это блокировка, но в API он также блокирует запрашивающий поток и создает проблемы с производительностью?

Есть ли альтернативный способ добиться этого. Все наши методы API имеют асин c характер. Мы используем. net Core 3.1. В соответствии с документацией ASP. NET, если мы используем асин c -wait методы, это будет очень быстро, но если мы добавим эти перехватчики с .Result и сделаем их синхронными, возникнут ли какие-либо проблемы с производительностью? Пожалуйста, дайте нам знать. Есть ли лучшие способы справиться с этим, не влияя на производительность?

...