Asp.net mvc 4 MVC4 Razor实时更新视图

Asp.net mvc 4 MVC4 Razor实时更新视图,asp.net-mvc-4,signalr,real-time,Asp.net Mvc 4,Signalr,Real Time,我是一个相对的noob程序员,所以提前道歉 我正在使用MVC4和Razor进行编写,并且有一个用户选择视图,它可能导致从控制器发出许多web调用。我想更新结果视图 当这些web服务调用返回时,控制器会在一分钟内进行实时更新,尽管控制器似乎会等到所有web调用完成后再更新模型 以及渲染结果视图。我们尝试使用async并等待改进,但只取得了微小的成功 我遇到的其他问题是,我们正在使用内部框架,并在webcall返回后执行其他操作,例如日志记录\偶尔访问数据库,所有这些 导致控制员的行动持续相当长的一

我是一个相对的noob程序员,所以提前道歉

我正在使用MVC4和Razor进行编写,并且有一个用户选择视图,它可能导致从控制器发出许多web调用。我想更新结果视图 当这些web服务调用返回时,控制器会在一分钟内进行实时更新,尽管控制器似乎会等到所有web调用完成后再更新模型 以及渲染结果视图。我们尝试使用async并等待改进,但只取得了微小的成功

我遇到的其他问题是,我们正在使用内部框架,并在webcall返回后执行其他操作,例如日志记录\偶尔访问数据库,所有这些 导致控制员的行动持续相当长的一段时间

把它放在上下文中,这是一个监控应用程序,因此根据用户的选择,我们可能有0->几百个内部web服务调用,只需单击一个按钮

因此,本质上我想知道如何最好地处理这个问题,例如,在MVC4视图中,您有多个单独的web服务调用,其中一些可能是 冗长,例如最多60秒

我对如何改进的想法是

  • 使用SignalR,在各个Web服务响应的地方,向结果屏幕广播更新~但是我仍然有代码等待的问题 在呈现视图之前,我的控制器将完成对webservices的调用

  • 避免等待控制器方法,例如“输出=等待pc.CallApprovariescs(selectedServiceInfoDetails);”也许将所有调用传递给某个内部堆栈,并设置一个计时器 弹出它们并在另一个类中的不同线程上处理它们,这样就可以释放我的控制器,立即显示默认的结果视图,让Signaler更新它 实时

  • 这一切似乎有点像用大锤敲打核桃,当然MVC4有更好的方法来处理这种情况吗

    提前感谢,

    N

    公共虚拟异步任务多命令(手动选择VM型号)
    {
    var viewObject=新的手动选择结果vm();
    如果(型号!=null)
    {
    var input=newserviceinfo();
    //根据用户选择从缓存中检索serviceInfo对象详细信息,它们是唯一的
    列出selectedServiceInfoDetails=GetServiceInfoDetailsFromCache(GetSelectedServiceInfoId(模型));
    列表输出=新列表();
    IGenericPC pc=null;
    尝试
    {
    pc=PCFactory.Create();
    输出=等待pc.CallApprovariatecs(selectedServiceInfoDetails);
    viewObject=ConvertServiceOutputIntoVM(输出);
    }
    最后
    {
    AICS.ARCHITECTURE.SERVICES.CLEANUP.CleanupSVC.CLEANUP(pc);
    }
    }                
    返回此.View(MVC.ManualSelection.Views.Result,viewObject);
    }
    
    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);
    }