2016-09-24 63 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”); –