2016-07-16 66 views
0

我正试图完成一个任务,我被困在并需要您的帮助。显示来自多个异步Web请求的结果下载

我做了一个Web窗体的网站在Visual Studio 2015年

我有一个页面上的按钮和显示来自Web请求的结果的DIV。

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

现在让我们假设,Request1需要1秒,请求2采用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完成立即,然后显示其网页上的结果时请求2或Request3完成更新这一要求的结果网页

预先感谢您

+1

然后,你需要做从客户端三种不同的要求。 – Fabio

+0

@Fabio这三个不同的调用 –

+0

您的代码首先调用PerformSearchAsync将只在所有downloadTask完成后才会返回响应。 II意味着你创建一个“执行”只有一个搜索任务的方法。然后从你的客户端(ajax调用)分别调用这个方法和三个不同的参数 – Fabio

回答

0

Task.WhenAny(downloadTasks)运行在视窗GUI(WinForm的)比的WebForm不同。

在Web窗体 - ASP.NET知道,以保持请求的生命,直到该请求所有异步操作已经完成。

异步不会更改HTTP协议。

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

什么情况是,该网站完成所有任务异步先显示的数据:) (如你所说)

如果启用了跟踪,你可以得到这样的结果如下(用于下载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

所以页面会后完整呈现executi正如你在上面的跟踪结果中看到的那样。

我建议,由法比奥评论,separatly使用jQuery ajax调用不同的参数。

你可以阅读: AsyncTask with a Updatepanel?