Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.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# 方法赢得';在移动到下一个之前,不能完全执行_C#_Uwp - Fatal编程技术网

C# 方法赢得';在移动到下一个之前,不能完全执行

C# 方法赢得';在移动到下一个之前,不能完全执行,c#,uwp,C#,Uwp,所以我有一个apiService可以从我的数据库中获取旅行信息 public class ApiService { public ObservableCollection<Trip> Trips; public ApiService() { Trips = new ObservableCollection<Trip>(); } public async void LoadTripsAsync() {

所以我有一个apiService可以从我的数据库中获取旅行信息

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的构造函数中,它现在完全可以工作了