2013-12-11 2 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

비동기를 사용하고 있습니다. – ps2goat

+0

간단한 Parallel.ForEach가 궁금하십니까? http://msdn.microsoft.com/en-us/library/dd460720(v=vs.110).aspx - 아, 한 번에 10 개만 원합니다. 제한에 대한이 그래서 질문을보십시오 : http://stackoverflow.com/questions/9290498/how-can-i-limit-parallel-foreach –

+0

그래서 만약 내가 병렬을 사용합니다.각각 비동기 작업 을 가질 필요가 없습니까? 개인 문자열 GetURLData (문자열 URL) 만 가질 수 있습니까? – user2868614

답변

0

에게 있습니다 당신이 웹 서버에서 웹 서버를 복제하려고하는 나에게 보인다.

각 웹 요청은 웹 서버에서 자체 스레드를 시작합니다. 이러한 요청은 서버에 액세스 할 수있는 곳이면 어디서든 시작할 수 있기 때문에 서버 자체 만 액세스하거나 액세스 할 수 있습니다 (깨끗한 방법으로).

내가 요청하는 것처럼 요청을 처리하고 추적하려는 경우 AJAX 요청이이를 수행하는 가장 좋은 방법입니다. 이렇게하면 스레드와 요청을 가장 잘 관리 할 수 ​​있도록 서버를 그대로 둘 수 있지만 진행 상황을 관리하고 JSON 반환 결과를 통해 모니터링 할 수 있습니다.

자세한 방법은 jQuery.ajax을 참조하십시오.

0

간단한 기능으로 위에서 언급 한 기능을 수행하려면 각 작업마다 BackgroundWorker를 호출하는 것이 좋습니다. 진행 상황을 추적하고 작업 완료시 알림을받을 수 있습니다. 이것을 선택하는 또 다른 이유는 언급 된 작업이 백엔드 작업처럼 보이며 UI와 밀접하게 결합되어 있지 않기 때문입니다. 여기에 msdn이 있습니다 link

관련 문제