C# 使用.NETAsync将对象放入AmazonS3

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

我想使用如下方式将AWS S3异步方法转换为任务:

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);