C# 使用.NETAsync将对象放入AmazonS3
我想使用如下方式将AWS S3异步方法转换为任务:C# 使用.NETAsync将对象放入AmazonS3,c#,amazon-s3,async-await,C#,Amazon S3,Async Await,我想使用如下方式将AWS S3异步方法转换为任务: using (var client = AWSClientFactory.CreateAmazonS3Client(accessKey, secretKey)) { var request = new PutObjectRequest(); // ... set request properties ... await Task.Factory.FromAsync<PutObjectRequest, PutObj
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
);
}
我对异步的调用是否不正确,或者这里是否出现了其他问题
附言
- .NET Framework 4.5
- AWSSDK版本1.5.17.0
我遇到了同样的问题。您的FromAsync调用是正确的。在不使用FromAsync包装器直接调用BeginPutObject/EndPutObject时,也存在同样的问题
同步方法AmazonS3Client.PutObject()具有以下主体:
IAsyncResult asyncResult;
asyncResult = invokePutObject(request, null, null, true);
return EndPutObject(asyncResult);
而AmazonS3Client.BeginPutObject则表示:
return invokePutObject(request, callback, state, false);
请注意invokePutObject的最后一个布尔参数。此参数称为“已同步”。如果使用synchronized=true调用它,则它可以工作(通过同步执行操作)。如果使用synchronized=false调用它,则在并发加载下,将得到发布的异常
这显然是AWS SDK中的一个缺陷,需要进一步调查。在AWS论坛上看起来相似,但可能不是同一个问题;我对那里的上游回复不满意,因为并发同步上传确实有效
ETA:新的AWS SDK版本2.0(在编写本文时为beta版)需要.Net 4.5,具有本机的FooAsync方法(而不是Begin/EndFoo)。它基于新的System.Net.HttpClient库,而不是旧的HttpWebRequest。它几乎肯定没有这个bug,但我自己还没有测试过。我认为您的fromsync
看起来是正确的。我怀疑AWSSDK中有bug。client.BeginPutObject
返回什么?仅供参考,我刚刚尝试了这个。它起作用了。我从来没有遇到过返回IAsyncResult
而不是Task
的东西,所以谢谢你的代码!
return invokePutObject(request, callback, state, false);