And*_*vey 6 c# amazon-s3 async-await
我想使用以下内容将AWS S3异步方法转换为Task:
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
);
}
Run Code Online (Sandbox Code Playgroud)
但是,我得到以下异常:
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)
Run Code Online (Sandbox Code Playgroud)
我的电话是FromAsync不正确还是其他地方出了问题?
PS
我遇到了同样的问题。您的 FromAsync 调用是正确的。在不使用 FromAsync 包装器的情况下直接调用 BeginPutObject/EndPutObject 时,也存在同样的问题。
同步方法 AmazonS3Client.PutObject() 具有以下主体:
IAsyncResult asyncResult;
asyncResult = invokePutObject(request, null, null, true);
return EndPutObject(asyncResult);
Run Code Online (Sandbox Code Playgroud)
而 AmazonS3Client.BeginPutObject 说:
return invokePutObject(request, callback, state, false);
Run Code Online (Sandbox Code Playgroud)
请注意 invokePutObject 的最后一个布尔参数。这个参数被称为“同步”。如果您使用synchronized=true 调用它,它就会起作用(通过同步执行操作)。如果您使用synchronized = false调用它,在并发负载下,您会得到您发布的异常。
这显然是 AWS SDK 中的一个错误,需要进一步调查。AWS 论坛上的这篇文章看起来很相似,但可能不是同一个问题;我对上游回复不满意,因为并发同步上传确实有效。
ETA:新的 AWS SDK 版本 2.0(在撰写本文时处于测试阶段)需要 .Net 4.5,具有本机 FooAsync 方法(即 Begin/EndFoo)。它基于新的 System.Net.HttpClient 库,而不是旧的 HttpWebRequest。它几乎肯定没有这个错误,但我还没有亲自测试过。
| 归档时间: |
|
| 查看次数: |
3621 次 |
| 最近记录: |