2013-12-11 4 views
1

Я читал много о ThreadPools, Tasks и Threads. Некоторое время спустя я довольно запутался в этом. Многие люди говорят отрицательные/положительные вещи о каждом ... Может быть, кто-то может помочь мне найти решение для моей проблемы. Я создал простую диаграмму, чтобы лучше понять свою точку зрения.C# Как обрабатывать несколько веб-запросов сразу

enter image description here

В основном слева находится список из 5 строк (URL), что должны быть обработаны. В центре есть только моя идея обработчика, у которого есть 2 события для отслеживания прогресса. Внутри этого обработчика все 5 URL-адресов создают для них отдельные задачи, которые отображаются синим цветом. После каждого завершения я хочу, чтобы каждый возвращал результаты веб-страницы обработчику. Когда все они вернут значение, я хочу, чтобы OnComplete был вызван, и вся эта информация передавалась в основной поток.

Надеюсь, вы поймете, что я пытаюсь сделать. Заранее благодарим всех, кто хотел бы помочь!

Обновление Я принял ваши предложения и поместил их в использование. Но у меня все еще есть несколько вопросов. Вот код, который я создал, помните, что это не доказательство построения, а просто концепция, чтобы увидеть, если я пойду в правильном направлении. Пожалуйста, прочитайте комментарии, я включил свои вопросы о том, как действовать там. Спасибо всем, кто интересовался моим вопросом.

public List<String> ProcessList (string[] URLs) 
{ 
    List<string> data = new List<string>(); 
    for(int i = 0; i < URLs.Length - 1; i++) 
    { 
     //not sure how to do this now?? 
     //I want only 10 HttpWebRequest running at once. 
     //Also I want this method to block until all the URL data has been returned.    
    } 
    return data; 
} 

private async Task<string> GetURLData(string URL) 
{ 
    //First setup out web client 
    HttpWebRequest Request = GetWebRequest(URL); 
    // 
    //Check if the client holds a value. (There were no errors) 
    if (Request != null) 
    { 
     //GetCouponsAsync will return to the calling function and resumes 
     //here when GetResponse is complete. 
     WebResponse Response = await Request.GetResponseAsync(); 
     // 
     //Setup our Stream to read the reply 
     Stream ResponseStream = Response.GetResponseStream(); 

     //return the reply string here... 
    } 
} 
+1

использовать async и ждать – ps2goat

+0

Простой Parallel.ForEach не может быть вопрос? http://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx - Ах, я вижу, вам нужно всего 10 за раз. Взгляните на этот вопрос SO для ограничения: http://stackoverflow.com/questions/9290498/how-can-i-limit-parallel-foreach –

+0

Итак, если я использую Parallel.ForEach Мне не нужна задача async ? Я могу просто иметь приватную строку GetURLData (строковый URL)? – user2868614

ответ

1

Вы слышали об асинхронных и ждущих операторах?

http://msdn.microsoft.com/en-us/library/hh191443.aspx

+0

Я обновил свой вопрос кодом, который я написал, используя ваши предложения. Пожалуйста, взгляните на это. Спасибо! :) – user2868614

0

Мне кажется, что вы пытаетесь воспроизвести веб-сервер в веб-сервере.

Каждый веб-запрос запускает собственный поток на веб-сервере. Поскольку эти запросы могут происходить из любого места, имеющего доступ к серверу, ничего, кроме самого сервера, не имеет доступа или возможности управлять ими (чистым способом).

Если вы хотите обрабатывать запросы и отслеживать их, как я полагаю, вы спрашиваете, запросы AJAX были бы лучшим способом сделать это. Таким образом, вы можете оставить сервер для управления потоками и запросами в лучшем случае, но вы можете управлять их прогрессом и контролировать их с помощью результатов возврата JSON.

Загляните в jQuery.ajax за некоторыми идеями о том, как это сделать.

0

Чтобы достичь вышеуказанных функциональных возможностей простым способом, я бы предпочел называть BackgroundWorker для каждой из задач. Вы можете отслеживать прогресс и получать уведомление о завершении задания. Еще одна причина, по которой это делается, заключается в том, что упомянутые задачи выглядят как задняя задача и не тесно связаны с пользовательским интерфейсом. Вот msdn link

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