我是一名相对的noob程序员,所以请提前道歉!
我正在使用MVC4和Razor编写,并且有一个用户选择视图,可能会导致从控制器进行许多Web调用。我想更新结果视图 这些Web服务调用返回的实时实时,虽然看起来控制器在更新模型之前等待所有Web调用完成 并渲染结果视图。我们试图使用异步并等待改进,但收效甚微。
我遇到的其他复杂情况是,我们正在使用内部框架并在网络连接返回时执行其他操作,例如记录\偶尔的数据库访问,所有这些 导致控制人员采取相当长的一段时间。
要将其置于上下文中,这是一个监控应用程序,因此根据用户选择,我们可能会有0 - >点击按钮即可进行数百次内部Web服务调用。
所以基本上我想知道如何最好地处理这个问题,例如实时更新MVC4视图,其中您有多个单独的Web服务调用,其中一些可能是 冗长的,例如最多60秒
我对如何改善事物的想法是
使用SignalR并在各个Web服务响应的位置,向结果屏幕广播更新〜但是我仍然遇到代码正在等待的问题 我的控制器在渲染视图之前调用webservices完成。
以避免等待控制器方法,例如' output = await pc.CallApproriateSCs(selectedServiceInfoDetails);'也许将所有的调用传递给一些内部堆栈并有一个计时器 弹出它们并在另一个类的另一个线程上处理它们,然后这可以让我的控制器立即显示默认的结果视图,让SignalR更新它 实时
提前致谢,
<磷>氮public virtual async Task<ActionResult> MultipleCommand(ManualSelectionVM model)
{
var viewObject = new ManualSelectionResultVM();
if (model != null)
{
var input = new ServiceInfo();
//Retrieving serviceInfo object details from cache based on user selection, they are unique
List<ServiceInfo> selectedServiceInfoDetails = GetServiceInfoDetailsFromCache(GetSelectedServiceInfoIDs(model));
List<ServiceOutputCdt> output = new List<ServiceOutputCdt>();
IGenericPC pc = null;
try
{
pc = PCFactory.Create<IGenericPC>();
output = await pc.CallApproriateSCs(selectedServiceInfoDetails);
viewObject = ConvertServiceOutputIntoVM(output);
}
finally
{
AICS.ARCHITECTURE.SERVICES.CLEANUP.CleanupSVC.Cleanup(pc);
}
}
return this.View(MVC.ManualSelection.Views.Result, viewObject);
}