2012-09-28 4 views
0

blob을 비동기 적으로 업로드하는 것과 관련하여 혼란 스럽 습니다만 여기에서 답변을 찾으십시오.EndUploadFromStream을 (를) 혼동합니다.

먼저 내 코드에서 봐 주시기 바랍니다,

나는 푸른 블랍에 mutil 파일을 업로드해야
public void UploadMultipleBlobs(List<string> filelocations, string containerName, AsyncCallback callback = null, string path = null) 
    { 
        try 
     { 

      Parallel.ForEach(filelocations, fileLocation => 
       { 

        //File to Stream 
        MemoryStream str = new MemoryStream(); 
        byte[] file = File.ReadAllBytes(fileLocation); 
        str.Write(file, 0, file.Length); 
        str.Seek(0, SeekOrigin.Begin); 

        //Operations 
        if (callback == null) 
         callback = new AsyncCallback(OnUploadCompleted); 
        BlobRequestOptions blobRequestOptions = new BlobRequestOptions(); 
        blobRequestOptions.Timeout = new TimeSpan(1, 0, 0); 
        blobRequestOptions.RetryPolicy = retry; 

        CloudBlob currentBlob = container.GetBlobReference(blobName); 
        var result = currentBlob.BeginUploadFromStream(str, blobRequestOptions, callback, new Object[] { currentBlob, str }); 

        currentBlob.EndUploadFromStream(result); 
       }); 

     } 
     catch 
     { 
      throw; 
     } 

    } 

private void OnUploadCompleted(IAsyncResult result) 
    { 
     try 
     { 
      // Get array passed to callback 
      Object[] states = (Object[])result.AsyncState; 

      var blob = (CloudBlob)states[0]; 
      var stream = (MemoryStream)states[1]; 

      // End the operation 
      //blob.EndUploadFromStream(result); 

      // Close the stream 
      stream.Close(); 
     } 
     catch 
     { 
      throw; 
     } 
    } 

는, 파일의 수는 10-50,000 될 수있다, 각 파일은 10킬로바이트-50킬로바이트에 관한 것입니다. 코드 스 니펫이 현재 잘 작동합니다. 그러나 콜백에서 EndUploadFromStream을 호출하면 2,000 개가 넘는 파일을 업로드 할 때 항상 예외가 발생합니다. 나는 업로드 메서드에서 EndUploadFromStream을 제거하고 콜백 (OnUploadCompleted 메서드)에서 EndUploadFromStream을 호출하면 예외가 발생합니다. 아래 예외 메시지 :

없음

가 전송 연결에서 데이터를 읽을 수 : 연결이 종료하고, 스택 트레이스 :. Microsoft.WindowsAzure.StorageClient.Tasks.Task`1.get_Result (AT)

을 마이크로 소프트. WindowsAzure.StorageClient.CloudBlob.EndUploadFromStream (IAsyncResult asyncResult)

나는 왜 그런 일이 일어날 지 모르겠다.

감사합니다.

답변

0

시작/종료 코드가 정상적으로 보입니다. 비동기 작업이 완료되기를 기다리는 데 아무 것도하지 않으므로 문제가 관련 될 수 있습니다. 예를 들어 콘솔 응용 프로그램에서이 파일을 실행하는 경우 모든 업로드가 완료되기 전에 응용 프로그램이 종료 된 다음 해당 오류가 발생할 수 있습니다. EndUploadFromStream() 호출이 Parallel.ForEach() 내부에있는 경우 문제가되지 않으므로 모든 업로드가 완료 될 때까지 Parallel.ForEach() 호출이 차단됩니다.

모든 업로드가 완료되기를 기다리는 코드를 추가하고 수정했는지 확인해보십시오. 간단한 방법은 전체 업로드 횟수로 초기화 된 다음 카운터에서 콜백 내부에서 감소 (스레드 안전성을 위해 Interlocked.Decremement() 사용)하는 것입니다. 또 다른 옵션은 Task.FromAsync()을 사용하여 Task 객체의 배열을 가져온 다음 Task.WaitAll()을 사용하여 완료 될 때까지 기다리는 것입니다.

제쳐두고 Parallel.ForEach()과 Begin/End 메서드를 동시에 사용하면 중복됩니다. Begin/End는 비동기 적이므로 일반적으로 호출하기 위해 여러 스레드를 사용하는 지점이 없습니다. 아이템의 목록이 많으므로 일 수도 있고 일 수도 있습니다.하지만이 경우에는 약간의 차이가있을 수 있습니다. 중요한 차이를 실제로 측정하지 않았다면 대신 간단한 foreach 루프를 사용하는 것이 좋습니다.