显示来自已下载的多个异步Web请求的结果

时间:2016-07-16 07:07:31

标签: c# asp.net asynchronous async-await task

我正在努力完成一项我被困住的任务,需要你的帮助。

我在Visual Studio 2015中创建了一个Web窗体。

我在页面上有一个按钮,而DIV则显示来自网络请求的结果。

我在三个网址上调用GetAsync并发出3个网络请求。让我们将它们命名为Request1,Request2和Request3。

现在让我们假设,Request1需要1秒,Request2需要5秒,Request3需要10秒才能获得数据。

网站首先完成所有异步任务,然后显示数据。

我希望数据显示为首次下载的第一个显示基础。

private async Task PerformSearchAsync()
    {

        HttpClient client = new HttpClient();
        List<string> urlList = SetUpURLList();

        IEnumerable<Task<RootObject>> downloadTasksQuery =
            from url in urlList select ProcessURL(url, client);

        List<Task<RootObject>> downloadTasks = downloadTasksQuery.ToList();

        while (downloadTasks.Count > 0)
        {
            // Identify the first task that completes.
            Task<RootObject> firstFinishedTask = await Task.WhenAny(downloadTasks);

            // ***Remove the selected task from the list so that you don't
            // process it more than once.
            downloadTasks.Remove(firstFinishedTask);

            // Await the completed task.
            RootObject rootObject = await firstFinishedTask;
            DisplayResult(rootObject);
        }


    }

private void DisplayResult(RootObject rootObject)
    {
        string s = "Name: "+rootObject.name+ " <span><img src =\"http://"+rootObject.logo+"\" alt=\"Source Logo\" style=\"width:16px;height:16px;\"></span>";
        Source.InnerHtml += s;
    }

所以我想要做的是如果Request1完成后立即在网页上显示其结果,然后当Request2或Request3完成时,用该请求的结果更新网页

提前谢谢

1 个答案:

答案 0 :(得分:0)

Task.WhenAny(downloadTasks)在Windows GUI(WinForm)中运行与WebForm不同。

在WebForm中 - ASP.NET知道在请求的所有异步操作都完成之前保持请求处于活动状态。

异步不会更改HTTP协议。

异步操作在服务器上不在客户端(浏览器)中的asp.net上下文中工作,所以:

网站首先完成所有异步任务,然后显示数据:)(正如您所说)

如果您启用了Trace,您可以获得如下结果(用于下载5个链接)以了解发生的情况:

CategoryMessageFrom First(s)From Last(s) aspx.pageBegin PreInit   aspx.pageEnd PreInit0.0001290.000129 aspx.pageBegin Init0.0001430.000014 aspx.pageEnd Init0.0001680.000024 aspx.pageBegin InitComplete0.0001790.000011 aspx.pageEnd InitComplete0.0001910.000012 aspx.pageBegin LoadState0.0002050.000014 aspx.pageEnd LoadState0.0007550.000550 aspx.pageBegin ProcessPostData0.0007720.000017 aspx.pageEnd ProcessPostData0.0012780.000506 aspx.pageBegin PreLoad0.0012950.000017 aspx.pageEnd PreLoad0.0013110.000016 aspx.pageBegin Load0.0013240.000013 aspx.pageEnd Load0.0013530.000029 aspx.pageBegin ProcessPostData Second Try0.0013650.000012 aspx.pageEnd ProcessPostData Second Try0.0013750.000010 aspx.pageBegin Raise ChangedEvents0.0013860.000011 aspx.pageEnd Raise ChangedEvents0.0014000.000014 aspx.pageBegin Raise PostBackEvent0.0014100.000011 aspx.pageEnd Raise PostBackEvent0.0021300.000720 aspx.pageBegin LoadComplete0.0021500.000019 aspx.pageEnd LoadComplete0.0021620.000012 aspx.pageBegin PreRender0.0021730.000011 aspx.pageEnd PreRender0.0021930.000021  http://msdn.microsoft.com0.0301360.027942  http://msdn.microsoft.com/library/windows/apps/br211380.aspx4.5581914.528055  http://msdn.microsoft.com/en-us/library/hh290136.aspx18.06925713.511066  http://msdn.microsoft.com/en-us/library/dd470362.aspx23.2873405.218083  http://msdn.microsoft.com/en-us/library/aa578028.aspx25.5387092.251369  http://msdn.microsoft.com/en-us/library/ms404677.aspx30.5350954.996386  http://msdn.microsoft.com/en-us/library/ff730837.aspx36.9596576.424562 aspx.pageBegin PreRenderComplete41.3143724.354715 aspx.pageEnd PreRenderComplete41.3148800.000508 aspx.pageBegin SaveState41.3152210.000341 aspx.pageEnd SaveState41.3171340.001914 aspx.pageBegin SaveStateComplete41.3171850.000051 aspx.pageEnd SaveStateComplete41.3172100.000025 aspx.pageBegin Render41.3172340.000025 aspx.pageEnd Render41.3193730.002138

因此,在完成所有任务的执行后,页面将呈现,如上面的跟踪结果中所示。

我建议,正如Fabio所评论的那样,使用不同参数分别调用Jquery ajax。

你可以读到: AsyncTask with a Updatepanel?