C# 方法赢得';在移动到下一个之前,不能完全执行
所以我有一个apiService可以从我的数据库中获取旅行信息C# 方法赢得';在移动到下一个之前,不能完全执行,c#,uwp,C#,Uwp,所以我有一个apiService可以从我的数据库中获取旅行信息 public class ApiService { public ObservableCollection<Trip> Trips; public ApiService() { Trips = new ObservableCollection<Trip>(); } public async void LoadTripsAsync() {
public class ApiService
{
public ObservableCollection<Trip> Trips;
public ApiService()
{
Trips = new ObservableCollection<Trip>();
}
public async void LoadTripsAsync()
{
HttpClient client = new HttpClient();
var json = await client.GetStringAsync(new Uri("http://localhost:49875/api/Trip/"));
var tripList = JsonConvert.DeserializeObject<IList<Trip>>(json);
foreach(var trip in tripList)
{
trip.DestinationImage = "Assets/Berlijn.jpg";
Trips.Add(trip);
}
}
}
问题是,我的APIservice中的ObservableCollection“Trips”总是空的。在数据库中有明确的旅行,因为我在其他地方使用了精确的Api方法,这是非常完美的
调试时,我发现一些非常奇怪的行为。我会尽力这样解释:
首先是这里:
_service.LoadTripsAsync();
然后,正如您所预料的,它会进入我的apiservice并运行,直到我到达以下位置:
var json = await client.GetStringAsync(new Uri("http://localhost:49875/api/Trip/"));
然后,我希望该方法的其余部分能够运行,这样它就可以填充ObservableCollection“trips”,但它会返回到我的viewmodel来运行该方法:
FirstTrip = _service.Trips.OrderBy(t => t.StartDate).FirstOrDefault();
当然,service.Trips仍然是空的
如何使它在执行其余的api方法之前先完成api方法?
LoadTripsAsync
是异步的,因此您必须等待它:
public class HomePageViewmodel
{
public Trip FirstTrip { get; set; }
private ApiService _service;
public HomePageViewmodel()
{
_service = new ApiService();
SetFirstTripAsync();
}
public async void SetFirstTripAsync()
{
await _service.LoadTripsAsync();
FirstTrip = _service.Trips.OrderBy(t => t.StartDate).FirstOrDefault();
}
}
LoadTripsAsync
是异步的,因此您必须等待它:
public class HomePageViewmodel
{
public Trip FirstTrip { get; set; }
private ApiService _service;
public HomePageViewmodel()
{
_service = new ApiService();
SetFirstTripAsync();
}
public async void SetFirstTripAsync()
{
await _service.LoadTripsAsync();
FirstTrip = _service.Trips.OrderBy(t => t.StartDate).FirstOrDefault();
}
}
LoadTripsAsync
是异步的;您需要等待它,但不能等待,因为它的返回类型是void
。将其更改为Task
。一般来说,.LoadTripsAsync
是异步的;您需要等待它,但不能等待,因为它的返回类型是void
。将其更改为Task
。作为一般规则,.我这样做了,并将apiService方法更改为一个任务,不幸的是,它现在仅在调试时有效,而不是仅在运行应用程序时有效。我还必须添加任务。运行(()=>this.SetFirstTripAsync()).Wait();在homepageview的构造函数中,它现在完全工作了。我这样做了,并将apiService方法更改为任务,不幸的是,它现在只在调试时工作,而不是在运行应用程序时工作。我还必须添加任务。run(()=>this.SetFirstTripAsync()).Wait();在我的homepageview的构造函数中,它现在完全可以工作了