2017-03-10 6 views
0

웹에서 수집 한 데이터 중 일부를 Windows 형태로 표시하는 앱을 만들고 있습니다. 모든 데이터를 다운로드하기 전에 순차적으로 기다려야합니다. 제한된 대기열 (최대 동시 작업 실행)에서 병렬로 수행하여 다운로드하는 동안 Dataagridview를 새로 고치는 방법을 보여줄 수 있습니까?인터넷에서 리소스를 다운로드하고 C# (winforms)로 즉시 (동시에 최대 동시 작업으로)보고 할 수 있습니다.

는 내가 오늘이 것은 내가 foreach는 (에 넣어하는 방법

internal async Task<string> RequestDataAsync(string uri) 
    { 
     var wb = new System.Net.WebClient(); //     
     var sourceAsync = wb.DownloadStringTaskAsync(uri); 
     string data = await sourceAsync; 
     return data; 
    } 

)이며 종료 후, 사용자 정의 개체의 목록에 데이터를 구문 분석, 다음의 DataTable에 해당 객체를 변환하고 바인딩 그게 datagridview.

가장 좋은 방법은 https://msdn.microsoft.com/library/system.threading.tasks.taskscheduler.aspx에있는 LimitedConcurrencyLevelTaskScheduler를 사용하고 있는지 (리소스가 다운 될 때마다 어떻게 그리드에보고 할 수 있는지 잘 모르겠 음) 잘 모르겠습니다. 그렇지 않은 경우 가장 좋은 방법이 있습니다.

동시에 모든 작업을 시작하고 싶지 않을 때가 있습니다. 때때로 내가 동시에 100 개 다운 라이트를 요청할 수 있기 때문에 동시에 최대 10 개의 작업을 실행하는 것이 좋습니다.

나는 그것이 동시 작업을 제어하고 다운로드하는 동안보고하는 것이지만 현재는 무엇이 최선인지를 잘 모르는 질문입니다.

답변

2

나는 종종 my book을 권장하지 않지만 도움이 될 것으로 생각합니다.

는 동시 비동기은 (내 책에서 조리법 2.4) Task.WhenAll을 통해 이루어집니다 :

List<string> uris = ...; 
var tasks = uris.Select(uri => RequestDataAsync(uri)); 
string[] results = await Task.WhenAll(tasks); 

것은 (내 책에서 조리법 11.5)을 SemaphoreSlim를 사용, 동시성을 제한하려면 :

List<string> uris = ...; 
var semaphore = new SemaphoreSlim(10); 
var tasks = uris.Select(async uri => 
{ 
    await semaphore.WaitAsync(); 
    try { await RequestDataAsync(uri); } 
    finally { semaphore.Release(); } 
}); 
string[] results = await Task.WhenAll(tasks); 

하는 데이터를 처리하기 위해 도착하면 다른 async 방법을 소개하십시오 (내 책의 요리법 2.6) :

List<string> uris = ...; 
var semaphore = new SemaphoreSlim(10); 
var tasks = uris.Select(async uri => 
{ 
    await semaphore.WaitAsync(); 
    try { await RequestAndProcessDataAsync(uri); } 
    finally { semaphore.Release(); } 
}); 
await Task.WhenAll(tasks); 

async Task RequestAndProcessDataAsync(string uri) 
{ 
    var data = await RequestDataAsync(uri); 
    var myObject = Parse(data); 
    _listBoundToDataTable.Add(myObject); 
} 
+0

정말 고마워요, 정말 스레딩, 동시성, 비동기/대기에 대한 지난 이틀 동안 읽고 있었고 여전히 모든 부분을 올바르게 풀링 할 수 없었습니다. 더 잘 이해할 수 있도록 책을 가져올 것입니다. 이제이 문제를 테스트해야합니다. 코드 및 그 일을 할 경우 참조하십시오 :) 빠른 대답 주셔서 감사합니다, 당신은 바위 – FabianSilva