2016-07-16 65 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?