【发布时间】:2022-12-24 09:11:07
【问题描述】:
在 Maui Xaml 应用程序中,我有一个页面及其视图模型,其中包含我想通过 api 调用检索的项目的 ObservableCollection。
我想在另一个服务中进行 api 调用,其中放置了所有相同的 api 调用。
顺便说一下,我正在使用 Maui CommunityToolkit mvvm 等,所以 InitializeCommand 与 eventToCommmandBehaviour OnAppearing 绑定到 UI。
我想要实现的是,项目在到达时被添加,而不是像通常读取响应和具体化数组中的项目那样成块。
在我的视图模型中:
private async Task InitializeCommand()
{
items.Clear();
var result = await _apiService.GetItemsAsync();
await foreach(var item in result)
{
items.Add(item);
}
}
apiService 方法执行此操作:
public async Task<IAsyncEnumerable<Item>> GetItemsAsync()
{
using var client = httpClientFactory.CreateClient();
using var response = await client
.GetAsync("myUrl", HttpCompletionOption.ResponseHeadersRead)
using var stream = await response.Content.ReadAsStreamAsync();
return JsonSerializer.DeserializeAsyncEnumerable<Item>(stream);
}
现在这个方法有问题,using关键字。首先,我不确定是否需要为 client、response 和 stream 指定 3 次。
但是除此之外,通过在 response 超出范围时立即处理它,在 InitializeCommand 方法中使用它时会出现异常!
我不确定如何以正确的方式处理所有这些请求,而不是在调用方进行处理。
在继续之前调用await.Response.Content.ReadAsStreamAsync();是否等待所有流被读取?我不想这样,我希望在读取标头后立即开始对 IAsyncEnumerable 的反序列化。
我应该返回流并在调用方法中反序列化它然后处理它吗?
【问题讨论】:
-
ReadAsStreamAsync医生说“返回的 Task<TResult> 对象将在读取了表示内容的所有流后完成。”听起来像你不想要的行为。虽然我确实看到提到子类能够以不同的方式实现,但不清楚 HttpResponse 的作用。你能写你自己的IAsyncEnumerable<T>方法,直到响应完成才结束吗?因此 Dispose 在资源耗尽之前不会发生。返回IEnumerable<T>将是foreach (var item ...) yield return item;,但我不知道如何为IAsyncEnumerable执行此操作。
标签: c# asp.net .net xamarin maui