2013-04-15 36 views
6

Tôi muốn chuyển đổi các phương pháp async AWS S3 thành một nhiệm vụ sử dụng một cái gì đó như thế này:Đặt đối tượng đến Amazon S3 sử dụng .net async

using (var client = AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey)) 
{ 
    var request = new PutObjectRequest(); 
    // ... set request properties ... 

    await Task.Factory.FromAsync<PutObjectRequest, PutObjectResponse>(
     client.BeginPutObject, 
     client.EndPutObject, 
     request, 
     null 
    ); 
} 

Tuy nhiên, tôi nhận được ngoại lệ sau đây:

System.ArgumentException: The IAsyncResult object was not returned from the corresponding asynchronous method on this class. 
Parameter name: asyncResult 
    at System.Net.HttpWebRequest.EndGetResponse(IAsyncResult asyncResult) 
    at Amazon.S3.AmazonS3Client.getResponseCallback[T](IAsyncResult result) 
    at Amazon.S3.AmazonS3Client.endOperation[T](IAsyncResult result) 
    at Amazon.S3.AmazonS3Client.EndPutObject(IAsyncResult asyncResult) 
    at System.Threading.Tasks.TaskFactory`1.FromAsyncCoreLogic(IAsyncResult iar, Func`2 endFunction, Action`1 endAction, Task`1 promise, Boolean requiresSynchronization) 

Cuộc gọi của tôi có phải là FromAsync không chính xác hoặc có sự cố gì khác không?

P.S.

  • .NET Framework 4.5
  • AWSSDK phiên bản 1.5.17.0
+1

Tôi nghĩ rằng 'FromAsync' của bạn có vẻ chính xác. Tôi sẽ nghi ngờ một lỗi trong AWSSDK. –

+1

Trả về 'client.BeginPutObject' là gì? –

+0

FYI, tôi vừa thử điều này. Nó hoạt động. Tôi đã không bao giờ gặp phải một cái gì đó mà trả về 'IAsyncResult' hơn là' Task 'vì vậy cảm ơn cho mã! – Sethi

Trả lời

4

Tôi đang gặp phải vấn đề tương tự. Cuộc gọi FromAsync của bạn là chính xác. Vấn đề tương tự tồn tại khi gọi BeginPutObject/EndPutObject trực tiếp mà không có trình bao bọc FromAsync.

Phương pháp AmazonS3Client.PutObject đồng bộ() có thân hình này:

IAsyncResult asyncResult; 
asyncResult = invokePutObject(request, null, null, true); 
return EndPutObject(asyncResult); 

Trong khi AmazonS3Client.BeginPutObject nói:

return invokePutObject(request, callback, state, false); 

Lưu ý các tham số boolean cuối cùng để invokePutObject. Đối số này được gọi là 'đồng bộ'. Nếu bạn gọi nó với đồng bộ = true, nó hoạt động (bằng cách thực hiện thao tác đồng bộ). Nếu bạn gọi nó với đồng bộ = false, dưới tải đồng thời, bạn sẽ nhận được ngoại lệ bạn đã đăng.

Rõ ràng là lỗi trong SDK AWS cần được điều tra thêm. This post trên diễn đàn AWS trông tương tự, nhưng nó có thể không phải là cùng một vấn đề; Tôi không hài lòng với câu trả lời ngược dòng ở đó, vì các video tải lên đồng bộ đồng thời hoạt động.

ETA: AWS SDK phiên bản 2.0 mới (trong phiên bản beta tại thời điểm viết), yêu cầu .Net 4.5, có các phương thức FooAsync gốc (được bắt đầu từ Begin/EndFoo). Nó dựa trên thư viện System.Net.HttpClient mới thay vì HttpWebRequest cũ. Nó gần như chắc chắn không có lỗi này, nhưng tôi vẫn chưa thử nghiệm nó.

Các vấn đề liên quan