1

청크로 된 파일을 웹 서비스에 업로드하려고합니다..NET 4를 사용하여 작업 파이프 라인 만들기?

// Web service method: 
void UploadFile(int fileId, byte[] chunk, int position, bool complete); 

.NET 4 작업 병렬 라이브러리를 사용하여 한 번에 하나의 파일을 업로드하고 싶습니다.

나는 클라이언트의 바이트 덩어리를 가지고, 나는 잘 하나 하나를 업로드 할 수 있습니다 :

List<byte[]> chunks = ...; 
webService.UploadFileAsyncCompleted += OnChunkUploaded; 
foreach (var chunk in chunks) 
{ 
    webService.UploadFileAsync(...); 
} 

그러나, 동시에 모든 청크를 업로드합니다. 각 청크를 하나씩 업로드하려고합니다. 원한다면 파이프 라인.

어떻게 .NET 4 작업 병렬 라이브러리에서이 작업을 수행 할 수 있습니까?

+0

"Silverlight에서 다른 작업을 하나씩 실행하는 것"이 ​​더 나은 제목 일 수 있습니다. –

답변

3

TPL이 필요하지 않습니다. 메서드 호출을 webService.UploadFile (...)로 변경하십시오. 당신이하려고하는 것은 동 기적으로 하나씩 다른 것을 업로드하는 것입니다. 왜 파이프 라인이 필요한가요?

+0

이 작업을 비동기 적으로 수행하고 싶습니다. UploadFile을 호출하지 않으려는 이유는 UI를 차단할 것이기 때문입니다. –

+0

webService가 무엇인지 모릅니다. 가능한 경우 N 바이트를 업로드 할 때마다 진행 상황을보고 (예 : ProgressChanged 이벤트) 한 비동기 요청에서 전체 파일을 한 번에 업로드 할 수 있습니다. 즉, 청크를 다루도록하십시오. 이것이 옵션이 아니라면, 코드에 webService.UploadFile (...)을 사용하여 코드를 삭제하고 BackgroundWorker를 사용하여 백그라운드 스레드에서이를 예약하십시오. –

+0

불행히도 Silverlight이므로 차단 호출이 없습니다. 그리고 예, TPL은 일부 CTP 비트를 통해 Silverlight에서 사용할 수 있습니다. 즉, 동기화 버전을 찾을 수 없기 때문에 동기 버전을 호출 할 수 없습니다. –

4

TPL을 사용하는 대신 정확히이 종류의 시나리오 (GUI 응용 프로그램의 백그라운드에서 작업 수행) 용으로 설계된 BackgroundWorker을 사용하는 것이 좋습니다. 그런 다음 UploadFile까지 동기 버전을 호출합니다. BackgroundWorker 클래스를 사용하면 보고서 진행과 같은 작업을 수행하고 필요한 경우 작업을 취소 할 수 있습니다.

+0

+1! 아이러니하게도 나는 원래의 대답에 대해 같은 말을 썼다. –

0

UploadFileAsyncCompleted 이벤트를 사용할 수 있습니다.

첫 번째 비동기 청크 업로드를 시작합니다. 그리고 나서 UploadFileAsyncCompleted 이벤트 핸들러를 다음으로 진행 시키십시오. 대략, this :

int chunksSent = 0; 
webService.UploadFileAsyncCompleted += delegate 
{ 
    chunksSent++; 
    if(chunksSent < chunks.Count) 
     webService.UploadFileAsync(..., chunk[chunksSent], ...); 
}; 
webService.UploadFileAsync(..., chunk[0], ...); 
0

순차적으로 일을 수행하는 병렬 라이브러리를 사용하는 것이 가장 좋은 방법은 아닙니다. F # 및 C# 5 CTP는 모두 매우 좋은 비동기 프로그래밍 모델을 가지고 있습니다. 그러나 이들을 사용할 수있는 위치에 있지 않다면 다음 덩어리를 업로드하기 전에 UploadFileAsyncCompleted 이벤트가 시작될 때까지 기다려야합니다.