【发布时间】:2020-04-21 12:49:11
【问题描述】:
我有一个任务需要向服务器调用 http 请求,我这样做:
public static async Task<BoundingBox> Transform(this BoundingBox boundingBox, string epsg) {
...
var min = _httpClient.GetStringAsync("https://epsg.io/trans?x=435951&y=5549182&s_srs=25832&t_srs=3857");
var max = _httpClient.GetStringAsync("https://epsg.io/trans?x=435911&y=5549122&s_srs=25832&t_srs=3857");
await Task.WhenAll(min, max);
...
}
priorityBb = bb.Transform("epsg:3857").GetAwaiter().GetResult();
但这会让我的 UI 挂起。
我的代码有什么问题?非常感谢您的评论。
【问题讨论】:
-
为什么要在函数内部正确使用
await,然后在调用函数时使用throw it all away? -
@GSerg 他仍然能够在 TaskWhenAll 之后获得
min.Result -
这个
priorityBb = bb.Transform("epsg:3857").GetAwaiter().GetResult();看起来不太好。GetResult();阻塞当前线程。使用priorityBb = await bb.Transform("epsg:3857");.. 并且您需要在某处收集结果以从转换中返回它们。 -
@JeroenvanLangen 但是
Transform将在Task.WhenAll返回之前将不完整的异步任务返回给调用者。这就是为什么它能够deadlock。 -
@JeroenvanLangen 我明白了。您将我的"throw it all away" 理解为丢弃函数调用结果的参考。不,我说的是要抛弃异步机制和好处。
标签: c# asynchronous async-await