2016-09-24 55 views
0

嗨,我張貼到使用以下方法的網址。這對我來說可以。我在這裏創建了五個任務。需要幫助,在等待異步webclient後響應

private async Task CreateMultipleTasksAsync(string url, ExtendedWebClient oExtendedWebClient, string sParam) 
     { 

      try 
      { 
       Task<string> download1 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sParam); 
       Task<string> download2 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sParam); 
       Task<string> download3 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sParam); 
       Task<string> download4 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sParam); 
       Task<string> download5 = oExtendedWebClient.ProcessURLAsync(url, oExtendedWebClient, sParam); 
       lst_tasks1.Add(download1); 
       lst_tasks2.Add(download2); 
       lst_tasks3.Add(download3); 
       lst_tasks4.Add(download4); 
       lst_tasks5.Add(download5); 

       // Await each task. 
       Result1 = await download1; 
       Result2 = await download2; 
       Result3 = await download3; 
       Result4 = await download4; 
       Result5 = await download5; 

      } 
      catch (Exception ex) 
      { 
       ErrorLog.createLog("ex.StackTrace = " + ex.StackTrace + " ex.tostring = " + ex.ToString()); 
      } 

     } 

我需要實現的是,如果任何任務返回包含字符串「START」字不再等待,繼續..

我這樣做是如下的方式:

Task.WaitAll(lst_tasks1.ToArray()); 
if (Result1.ToLower().Contains("START") && !Result1.Contains(sTextSearch)) 
{ 
    goto call2; 
} 
else 
{ 

worker.ReportProgress(0, "Waiting for tasks2"); 
Task.WaitAll(lst_tasks2.ToArray()); 

等等waitng達到任務5. 有沒有辦法做這個代碼使用Task.waitany請建議

+1

嘿,新手!歡迎來到StackOverflow,也被稱爲SO。這個地方非常嚴格,如果你不這樣做,你將無法在這個世界上生存。我們不是在這裏寫你的代碼。提出一個特定的問題,例如「爲什麼會發生這種情況?」。 SO在這裏,所以你可以問一個問題,而不是要求我們寫代碼/給你一個教程的合適的地方。 –

+0

我已經發布我的代碼,我已經做了。只需要更好的方式來實現這一點。 –

回答

1

You could try using the solution given in this post

您需要將您的條件作爲謂詞傳遞給此方法。

假設lst_tasks包含所有的任務,你可以做這樣的事情。

await WhenAny(lst_tasks, s => s == "START"); 

一旦任何任務返回START,這將停止等待。

+0

嗨費爾丁,我不明白給定的職位中提到的答案。我無法在我的代碼中實現建議的解決方案。我是新任務。如果可能的話請給我一個樣本來解決我的問題。如果我有論壇規則,我很抱歉。 –

+0

我已經更新瞭如何在代碼中使用該方法的答案。 您需要從另一個帖子中複製WhenAny的方法才能生效。 – Ferdin

+0

我可以在這個參數中添加一個條件,如下所示:await WhenAny(lst_tasks,s => s ==「START」&& s!=「NEWSTRING」); –