2016-09-20 2 views
1

У меня есть следующий метод, я хочу назвать этот метод несколько раз. и хотите проверить, содержит ли какая-либо из строки результата текст «Пуск», а затем переместить элемент управления вперед, иначе дождитесь «Пуск» в любой строке результата.Метод вызова async несколько раз в приложении формы окна

public async Task<string> ProcessURLAsync(string url, ExtendedWebClient oExtendedWebClient, string sParam) 
{ 
    ExtendedWebClient oClient = new ExtendedWebClient(false); 
    oClient.CookieContainer = oExtendedWebClient.CookieContainer; 
    oClient.LastPage = "https://www.example.co.in/test/getajax.jsf"; 
    byte[] PostData = System.Text.Encoding.ASCII.GetBytes(sParam); 
    Headers.Add("User-Agent", "Mozilla/5.0 (Windows T 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36"); 
    Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
    Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
    oClient.Headers.Remove("X-Requested-With"); 
    oClient.Headers.Add("X-Requested-With", "XMLHttpRequest"); 
    var byteArray = await oClient.UploadDataTaskAsync(url, PostData); 
    string result = System.Text.Encoding.UTF8.GetString(byteArray); 
    return result; 
} 

Просьба предложить способ достижения этого.

+0

я использовал Task.WaitAll. оно работает. но он ждет завершения всех задач. что я хочу, если кто-нибудь закончит, и в нем будет строка «Старт», а затем перейдите в другую, иначе подождите еще один. – Karan

ответ

2

Что вы можете сделать, это изменить свою задачу так, чтобы она выполнялась в цикле while и только выходила, когда ваше значение найдено.

Затем создайте список задач, используя цикл, итерируя столько задач, сколько хотите, чтобы он запускался одновременно.

Затем вы можете использовать Task.WhenAny

public async Task<string> ProcessURLAsync(string url, ExtendedWebClient oExtendedWebClient, string sParam) 
{ 
    string result = ""; 
    while (!result.Contains("Start")) 
    { 
     ExtendedWebClient oClient = new ExtendedWebClient(false); 
     oClient.CookieContainer = oExtendedWebClient.CookieContainer; 
     oClient.LastPage = "https://www.example.co.in/test/getajax.jsf"; 
     byte[] PostData = System.Text.Encoding.ASCII.GetBytes(sParam); 
     Headers.Add("User-Agent", "Mozilla/5.0 (Windows T 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/27.0.1453.116 Safari/537.36"); 
     Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); 
     Headers.Add("Content-Type", "application/x-www-form-urlencoded"); 
     oClient.Headers.Remove("X-Requested-With"); 
     oClient.Headers.Add("X-Requested-With", "XMLHttpRequest"); 
     var byteArray = await oClient.UploadDataTaskAsync(url, PostData); 
     result = System.Text.Encoding.UTF8.GetString(byteArray); 
    } 
    return result; 
} 

И затем использовать его как это:

 List<Task> taskList = new List<Task>(); 
     for(int i = 0; i < 20; i++) //Run 20 at a time. 
      taskList.Add(ProcessURLAsync(url, webClient, "whatever")); 
     await Task.WhenAny(taskList); 
     //Value found! Continue... 
+0

Я новичок в задаче, если возможно, вы можете отправить образец кода. – Karan

+0

выше метода вызовов цикла и ждет завершения. Я хочу использовать этот метод одновременно с другим параметром. – Karan

+0

Какой параметр отличается? – ThePerplexedOne

Смежные вопросы