以下两种方式有何不同:
async Task<T> method(){
var r = await dynamodb.GetItemAsync(...)
return r.Item;
}
对战
async Task<T> method(){
var task = dynamodb.GetItemAsync(...)
return task.Result.Item;
}
在我的情况下,出于某种原因,只有第二个有效。第一个似乎永远不会结束。
以下两种方式有何不同:
async Task<T> method(){
var r = await dynamodb.GetItemAsync(...)
return r.Item;
}
对战
async Task<T> method(){
var task = dynamodb.GetItemAsync(...)
return task.Result.Item;
}
在我的情况下,出于某种原因,只有第二个有效。第一个似乎永远不会结束。
await
异步地展开您的任务结果,而仅使用Result会阻塞,直到任务完成。
Result
是一个隐藏的死锁。 - Joshua.Result
或其所有可能的变体会导致线程池线程等待线程池上的作业完成。这可能会耗尽线程池中的所有线程,使得没有线程执行实际工作。 - Joshuaawait
而不是.Result
有什么意义? - Pedro Machadotask.Result 用于访问属性时的get访问器,会阻塞调用线程直到异步操作完成,它等效于调用Wait方法。 一旦操作结果可用,它将被存储并在后续调用Result属性时立即返回。请注意,如果任务操作期间发生异常或任务已被取消,则Result属性不会返回值。相反,试图访问属性值将抛出AggregateException异常。 唯一的区别在于await不会阻塞,而是异步等待Task完成,然后继续执行。
Result
称为裸类型是一种隐藏的死锁。 - Joshua