在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来获取其功能/逻辑,这也许也很重要
[Inject] public IHttpClientFactory clientFactory { get; set;}
using System.IO;
您的GetUrl方法:
public async Task<string> GetUrl(string url) { var request = new HttpRequestMessage(HttpMethod.Get, url); request.Headers.Add("Accept", "application/json"); request.Headers.Add("User-Agent", "get data service"); var client = clientFactory.CreateClient(); var response = await client.SendAsync(request); string res = null; if (response.IsSuccessStatusCode) { using var responseStream = await response.Content.ReadAsStreamAsync(); var streamReader = new StreamReader(responseStream); res = await streamReader.ReadToEndAsync().ConfigureAwait(false); } return res; }
Startup.cs
public void ConfigureServices(IServiceCollection services) { services.AddHttpClient(); // More code here... }
希望此方法有效...