C# ASP.NET MVC 4中的异步操作

C# ASP.NET MVC 4中的异步操作,c#,asp.net-mvc-4,asynchronous,async-await,C#,Asp.net Mvc 4,Asynchronous,Async Await,我有一个同步调用,我需要将其转换为async,我使用async/await关键字,但这只会在任务完成后返回,我需要做的是将结果逐个返回到UI 场景是,一旦用户通过身份验证,我会向用户显示一个任务列表,但是我希望在从数据库检索到任务后,一次加载一个任务,下面是我的actionResult,它将搜索条件放在一起,以预过滤任务: public async Task<ActionResult> Index(string searchTerm = null, int page = 1) {

我有一个同步调用,我需要将其转换为async,我使用async/await关键字,但这只会在任务完成后返回,我需要做的是将结果逐个返回到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);

 }
公共异步任务索引(字符串searchTerm=null,int page=1) { Shared.InitialiseCriteria(搜索标准); SearchCriteria.DepartmentID=部门ID; SearchCriteria.PageSize=15; SearchCriteria.FreeText=searchTerm; var模型=等待DoStuff(搜索标准); if(Request.IsAjaxRequest()) { 返回PartialView(“会话列表”,模型); } 返回视图(模型); } 这是wait任务,它调用GetConversation,当找到第一个任务时,它基本上会得到任务。我需要将它加载到索引视图中:

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

   return GetConversations(SearchCriteria);
}
private async Task DoStuff(CSearchCriteria搜索条件)
{
返回GetConversations(搜索条件);
}

ASP.NET MVC中async controller的唯一用途是在异步操作进行时释放IIS线程来管理其他一些请求。从调用方的角度来看,这与使用同步控制器是一样的

所以,我不认为使用异步控制器可以实现您想要的(您可以使用它,但它不会解决您的问题)


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

这里有几个问题:

  • 如何使ASP.NET在每个项目可用时立即开始返回数据
  • 如何协调客户机和服务器,以便客户机知道有一个新项目可用(即,它可以单独解析响应中的每个项目,或者如果您正在寻找“拉动”,它可以请求更多数据)
正如AlexK在回答中所解释的那样,
async
api不会改变服务器响应客户机的方式。Async只允许应用程序在线程未使用时释放线程,并使依赖于多个资源的请求部分更容易并行化

除了使用专门为此设计的信号器之外,您还可以使用内置的低级机制——您自己。以下是一些关于如何做到这一点的博客帖子:

  • 包括一些演示代码-向下滚动至“推送内容”
  • ,包括客户端(在浏览器中)的示例。亦与以下事项有关—

您能否进一步解释一下您预期会发生什么,以及实际会发生什么?我希望数据库中找到的任务能够一个接一个地加载到局部视图中,这样用户就不会在加载屏幕上出现,目前仅加载四个任务大约需要10秒。如果需要,我可以提供更多信息…+1。我有一篇博文解释了这一点。@Alex谢谢你的回复。你能告诉我如何才能达到预期的结果吗?我也尝试过线程,但不确定在从数据库检索到第一个任务后如何刷新/更新我的索引视图。我已经用我的意见更新了一个答案如何执行。