繁体   English   中英

ASP.NET MVC 4中的异步操作

[英]Async Actions in ASP.NET MVC 4

我有一个同步调用,我需要使用异步/等待关键字将其转换为异步消息,但是只有在任务完成后,此操作才会返回,我需要做的就是将结果逐个返回到UI。

场景是,一旦用户通过身份验证,我就会看到一个任务列表,但是一旦从数据库中检索到该任务,我希望一次加载一个任务,这是我的actionResult,它将搜索条件汇总为-过滤任务:

public async Task<ActionResult> Index(string searchTerm = null, int page = 1)
{
    Shared.InitialiseCriteria(SearchCriteria);
    SearchCriteria.DepartmentID = DepartmentID;
    SearchCriteria.PageSize = 15;
    SearchCriteria.FreeText = searchTerm;

    var model = await DoStuff(SearchCriteria);

        if (Request.IsAjaxRequest())
        {
            return PartialView("_ConversationList", model);
        }
    return View(model);

 }

这是一个等待任务,它称为GetConversation,它本质上是在找到第一个任务时获取任务,我需要将其加载到Index视图中:

private async Task<Result> DoStuff(CSearchCriteria SearchCriteria)
{

   return GetConversations(SearchCriteria);
}

ASP.NET MVC中的异步控制器的唯一目的是在进行异步操作时释放IIS线程来管理其他一些请求。 从呼叫者的角度来看,这与您使用同步控制器相同。

因此,我认为您无法使用异步控制器来实现所需的功能(可以使用它,但不能解决您的问题)。

我认为您可以在服务器端实现某种分页,以检索部分数据并通过SignalR将其发送给客户端。

这里有几个问题:

  • 如何使ASP.NET在每个项目可用时立即开始返回数据,
  • 如何协调客户端和服务器,以便客户端知道有新项目可用(即,它可以分别解析响应中的每个项目,或者如果您要查找“拉”,则可以请求更多数据)

如AlexK的答案所述, async api不会更改服务器对客户端的响应方式。 异步仅允许您的应用在不使用线程时释放它们,并使其更容易并行化依赖于多个资源的部分请求。

除了使用为此目的而设计的SignalR之外,您还可以自己使用内置的较低级机制-PushStreamContent 以下是一些有关如何执行此操作的博客文章:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM