Вызов асинхронного метода из фабрики пользовательских контроллеров в Asp.net MVC - PullRequest
0 голосов
/ 05 января 2019

Я использую фабрику пользовательских контроллеров (путем расширения DefaultControllerFactory) и вызываю пользовательский ActionInvoker (переопределяя InvokeAction метод). Теперь мне нужно вызвать метод Async из этого пользовательского ActionInvoker метода.

Проблема в том, что отсутствует соответствующий метод Async InvokeAction, который я могу переопределить и использовать для вызова из него моего метода Async. Пожалуйста, дайте мне знать, если у вас есть какие-либо предложения или входные данные для вызова асинхронного метода из InvokeAction метода.

Ниже приведен пример кода, чтобы прояснить ситуацию.

public class CustomControllerFactory : DefaultControllerFactory
{
    // Assign custom Action Invoker
    controller.ActionInvoker = new CustomActionInvoker();     
}

public class CustomActionInvoker: ControllerActionInvoker
{
    public override bool InvokeAction(ControllerContext controllerContext, 
        string actionName)
    {
        // can not use await here since InvokeAction method can not be marked Async
        var result =  await GetView()
        base.InvokeActionResult(controllerContext, view);
        Return true;
    }
}

ОБНОВЛЕНИЕ:

Могу ли я вызвать свой метод Async GetView из синхронного метода (InvokeAction). Мой метод GetView () Async в основном загружает файл из внешнего источника (операция по сети). Я предполагаю, что могу обернуть вызов GetView () в Task.Run, чтобы мой основной поток Asp был доступен для обслуживания какого-то другого веб-запроса. Будет ли Task.Run получать поток только из пула потоков Asp? Если да, то я думаю, что нет никакого реального преимущества, так как в любом случае собираюсь использовать пул потоков Asp, который я не хочу.

1 Ответ

0 голосов
/ 05 января 2019

Вы должны использовать асинхронное поведение таким образом

    protected override IAsyncResult BeginInvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor,
        IDictionary<string, object> parameters, AsyncCallback callback, object state)
    {

        // Initiate the asychronous call.
        var asyncResult = yourMethod.BeginInvoke(<your params>);

        // Wait for the WaitHandle to become signaled.
        asyncResult.AsyncWaitHandle.WaitOne();

        // Perform additional processing here.
        // Call EndInvoke to retrieve the results.
        var returnObject = yourMethod.EndInvoke(asyncResult);

        asyncResult.AsyncWaitHandle.Close();


        return base.BeginInvokeActionMethod(controllerContext, actionDescriptor, parameters, callback, state);
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...