【发布时间】:2020-06-12 09:26:22
【问题描述】:
我在 Blazor 中创建了一个组件列表,这些组件中的每一个都需要从网页请求一些数据。该列表在 .razor 页面上创建如下:
@foreach(stringcomp in Complist){
<myComponent />
}
创建了大约 100 个组件。在所有这些组件上,都会执行以下 URL 请求(使用此代码):
protected override async Task OnAfterRenderAsync(bool firstRender)
{
if (firstRender)
{
await GetUrl("some url here");
}
}
public async Task<string> GetUrl(string url)
{
HttpClient client = new HttpClient();
var request = new HttpRequestMessage(HttpMethod.Get, url);
request.Headers.Add("User-Agent", "get data service");
var response = await client.SendAsync(request).ConfigureAwait(false);
string res = null;
if (response.IsSuccessStatusCode)
{
using var responseStream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false);
var streamReader = new StreamReader(responseStream);
res = await streamReader.ReadToEndAsync().ConfigureAwait(false);
}
return res;
}
这样做我遇到了一些问题,我对 SendAsync 的大多数调用都不会返回值。我已经明白这是因为锁定状态,但我一生都无法弄清楚如何解决它。最相似的答案建议设置 .ConfigureAwait(false) 但这并没有在我的情况下产生不同的结果。
所以我的问题是:我可以在不同的组件中同时请求网页,并确保它们不会挂起/查找。由于有许多请求有时需要很长时间(5-10 秒)才能完成,因此同步执行它们并不是一种替代方法。
可能还需要提到我的代码和页面是分开的,每个 .razor 页面都使用@inherits 来获取其功能/逻辑
【问题讨论】:
-
您是否有理由根据
<myComponent>发出请求,而不是通过单个 http 请求获取您需要显示的所有数据? -
总共有超过 500 个请求,有些请求很慢,如果我需要在显示数据之前等待我的数据,等待时间可能会很长。另一种方法是在父母中做所有事情并在收到数据时将数据传递给孩子,但为什么需要这样做呢?我不明白为什么我的方法不起作用,因为在不同组件中执行单独的请求应该可以正常工作(即使我的情况有些极端)
-
浏览器通常限制为 5 个并行请求(移动设备上为 2 个),并且 Blazor 还不是真正的多线程,这可以解释您的问题
标签: async-await blazor dotnet-httpclient blazor-server-side