我正在使用自定义控制器工厂(通过扩展DefaultControllerFactory
)并调用自定义ActionInvoker
(重写InvokeAction
方法)。现在,我需要从此自定义ActionInvoker
方法调用Async方法。
问题不存在相应的Async InvokeAction
方法,我可以重写该方法并用来从中调用Async方法。如果您有任何建议或建议从InvokeAction
方法调用Async方法,请告诉我。
下面的代码示例使事情变得清晰。
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;
}
}
更新:
我可以从同步方法(InvokeAction)调用我的Async GetView方法吗?我的GetView()异步方法基本上是从外部源下载文件(网络操作)。我想我可以将Task.Run中的GetView()调用包装起来,这样我的主Asp线程将可用于处理其他一些Web请求。 Task.Run将仅从Asp线程池中获取线程吗?如果是的话,那么我想这并没有真正的优势,因为无论如何我都要消耗Asp线程池。
答案 0 :(得分:-1)
您需要以这种方式使用异步行为
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);
}