В нашем веб-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
и сделаем их синхронными, возникнут ли какие-либо проблемы с производительностью? Пожалуйста, дайте нам знать. Есть ли лучшие способы справиться с этим, не влияя на производительность?