Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 单独函数中的异步API调用_C#_Xamarin_Xamarin.forms_Async Await - Fatal编程技术网

C# 单独函数中的异步API调用

C# 单独函数中的异步API调用,c#,xamarin,xamarin.forms,async-await,C#,Xamarin,Xamarin.forms,Async Await,我有一个页面,在该页面中,我通过OnAppearing方法从API检索数据: protected override async void OnAppearing() { var content = await _client.GetStringAsync(Url); var footmarks = JsonConvert.DeserializeObject<List<Footmark>>(content); _footmarks = new Obs

我有一个页面,在该页面中,我通过
OnAppearing
方法从API检索数据:

protected override async void OnAppearing()
{
    var content = await _client.GetStringAsync(Url);
    var footmarks = JsonConvert.DeserializeObject<List<Footmark>>(content);
    _footmarks = new ObservableCollection<Footmark>(footmarks);
    listView.ItemsSource = _footmarks;

    base.OnAppearing();
}
然后是调用相同方法的事件处理程序:

void Handle_Refreshing(object sender, System.EventArgs e)
{
    listView.ItemsSource = GetFootmarks();
    listView.EndRefresh();
}
我该怎么做呢?

我会这样做:

将api调用提取到单个方法中:

async Task<List<Footmark>> GetFootMarksAsync()
{
    var content = await _client.GetStringAsync(Url);
    return JsonConvert.DeserializeObject<List<Footmark>>(content);
}
异步任务GetFootMarksAsync() { var content=await\u client.GetStringAsync(Url); 返回JsonConvert.DeserializeObject(内容); } 此方法可以在OnAppearing中调用

protected override async void OnAppearing()
{
    _footmarks = new ObservableCollection<Footmark>(await GetFootMarksAsync());

    listView.ItemsSource = _footmarks;

    base.OnAppearing();
}
protected override async void OnAppearing()
{
_footmarks=新的ObservableCollection(等待GetFootMarksAsync());
listView.ItemsSource=\u足迹;
base.OnAppearing();
}
在EventHandler中,它可以以相同的方式使用。唯一的更改是用async关键字标记处理程序

async void Handle_Refreshing(object sender, System.EventArgs e)
{
    _footmarks = new ObservableCollection<Footmark>(await GetFootMarksAsync());

    listView.ItemsSource = _footmarks;
    listView.EndRefresh();
}
async void Handle\u刷新(对象发送方,System.EventArgs e)
{
_footmarks=新的ObservableCollection(等待GetFootMarksAsync());
listView.ItemsSource=\u足迹;
EndRefresh();
}
所以最好将其移动到函数

将重复的功能提取到自己的功能中是一个明智的选择

async Task<ObservableCollection<Footmark>> GetFootmarks() {
    var json = await _client.GetStringAsync(Url);
    return JsonConvert.DeserializeObject<ObservableCollection<Footmark>>(json);
}
async Task<ObservableCollection<Footmark>> GetFootmarks() {
    var json = await _client.GetStringAsync(Url);
    return JsonConvert.DeserializeObject<ObservableCollection<Footmark>>(json);
}
public interface IFoomarkService {
    Task<ObservableCollection<Footmark>> GetFootmarks();
}
protected override void OnAppearing() {
    this.Appearing += Page_Appearing; //Subscribe to event
    base.OnAppearing();
}

protected async void Page_Appearing(object sender, EventArgs args) {
    listView.ItemsSource = await GetFootmarks(); //get data asynchronously
    //this.Appearing -= Page_Appearing; //Unsubscribe (OPTIONAL but advised)
}

protected async void Handle_Refreshing(object sender, System.EventArgs e) {
    listView.ItemsSource = await GetFootmarks(); //get data asynchronously
    listView.EndRefresh();
}