gpt4 book ai didi

c# - 使用 .net async 将对象放入 Amazon S3

转载 作者:太空狗 更新时间:2023-10-29 21:45:24 25 4
gpt4 key购买 nike

我想使用如下方法将 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
);
}

但是,我得到以下异常:

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 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 的最后一个 bool 参数。此参数称为“同步”。如果您使用 synchronized=true 调用它,它就可以工作(通过同步执行操作)。如果您使用 synchronized=false 调用它,在并发负载下,您会得到您发布的异常。

这显然是 AWS SDK 中的一个错误,需要进一步调查。 This post在 AWS 论坛上看起来很相似,但可能不是同一个问题;我对那里的上游回复不满意,因为并发同步上传确实有效。

预计到达时间:需要 .Net 4.5 的新 AWS SDK 2.0 版(撰写本文时处于测试阶段)具有原生 FooAsync 方法(取代 Begin/EndFoo)。它基于新的 System.Net.HttpClient 库而不是旧的 HttpWebRequest。它几乎可以肯定没有这个错误,但我自己还没有测试过。

关于c# - 使用 .net async 将对象放入 Amazon S3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16019546/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com