2013-04-15 7 views
6

का उपयोग कर रहा कुछ इस तरह का उपयोग कर एक टास्क में एडब्ल्यूएस S3 async तरीकों कनवर्ट करना चाहते हैं:रखो वस्तु .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 
    ); 
} 

हालांकि, मैं निम्न अपवाद प्राप्त करें:

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) 

क्या मेरी कॉल FromAsync गलत है या क्या कुछ और गलत हो रहा है?

पीएस

  • .NET फ्रेमवर्क 4.5
  • AWSSDK संस्करण 1.5.17.0
+1

मुझे लगता है कि आपका 'FromAsync' सही दिखता है। मुझे एडब्ल्यूएसएसडीके में एक बग पर संदेह होगा। –

+1

'client.BeginPutObject' वापस क्या करता है? –

+0

एफवाईआई, मैंने अभी कोशिश की है। यह काम करता हैं। मैंने कभी ऐसा कुछ नहीं सामना किया है जो 'कार्य ' के बजाय 'IAsyncResult' देता है, इसलिए कोड के लिए धन्यवाद! – Sethi

उत्तर

4

मैं एक ही समस्या का सामना कर रहा हूँ। आपका FromAsync कॉल सही है। FromAsync wrapper के बिना सीधे BeginPutObject/EndPutObject को कॉल करते समय भी वही समस्या मौजूद होती है।

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

जबकि AmazonS3Client.BeginPutObject का कहना है::

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

नोट invokePutObject करने के लिए पिछले बूलियन पैरामीटर

तुल्यकालिक विधि AmazonS3Client.PutObject() इस शरीर है। इस तर्क को 'सिंक्रनाइज़' कहा जाता है। यदि आप इसे सिंक्रनाइज़ = सत्य के साथ कहते हैं, तो यह काम करता है (ऑपरेशन को सिंक्रनाइज़ करके)। यदि आप इसे समकालिक लोड के तहत सिंक्रनाइज़ = झूठी कहते हैं, तो आपको अपवाद प्राप्त होता है।

यह स्पष्ट रूप से एडब्ल्यूएस एसडीके में एक बग है जिसे आगे की जांच की आवश्यकता है। एडब्ल्यूएस मंचों पर This post समान दिखता है, लेकिन यह एक ही मुद्दा नहीं हो सकता है; मैं वहां अपस्ट्रीम उत्तर से असंतुष्ट हूं, क्योंकि समवर्ती सिंक्रोनस अपलोड काम करते हैं।

ईटीए: है, जो नेट 4.5 की आवश्यकता है (लेखन के समय बीटा में) नई एडब्ल्यूएस एसडीके संस्करण 2.0, (के insted शुरू/EndFoo) देशी FooAsync तरीकों है। यह पुराने HttpWebRequest की बजाय नई System.Net.HttpClient लाइब्रेरी पर आधारित है। यह लगभग निश्चित रूप से इस बग नहीं है, लेकिन मैंने अभी तक इसका परीक्षण नहीं किया है।

संबंधित मुद्दे