确保Device.BeginInvokeOnMainThread在c#

时间:2017-12-01 06:40:38

标签: c# xamarin

我在private async Task签名方法中附上了以下代码。我的问题是ObservableCollection<Goods> goods = new ObservableCollection<Goods>();在下面的代码Device.BeginInvokeOnMainThread完成之前执行。在进入下一行之前,如何确保执行所有代码并正确获取值,即ObservableCollection<Goods> goods = new ObservableCollection<Goods>();

请注意,我在Task.Run()之前使用了等待Device...,但没有结果。

请帮忙。

Device.BeginInvokeOnMainThread(() =>
            {
                Location loc = new Location();
                GpsData = locService.GetLocation();
                a = GpsData.Latitude;
                b = GpsData.Longitude;

            });



        ObservableCollection<Goods> goods = new ObservableCollection<Goods>();

1 个答案:

答案 0 :(得分:0)

使用以下方法提取GPS位置检索代码:

async Task GetGpsData()
{
    var tcs = new TaskCompletionSource<bool>();

    Device.BeginInvokeOnMainThread(() => {
        try
        {
            Location loc = new Location();
            GpsData = locService.GetLocation();
            a = GpsData.Latitude;
            b = GpsData.Longitude;
            tcs.SetResult(true);
        }
        catch (Exception ex)
        {
            tcs.SetException(ex);
        }
    });

    return tcs.Task;
}

然后按如下方式使用它:

await GetGpsData();
ObservableCollection<Goods> goods = new ObservableCollection<Goods>();

修改

GetGpsData()是一种私有方法,应该没有问题async。然而,它基本上意味着调用者代码也必须是async。如果无法做到这一点,请执行以下操作:

GetGpsData().Wait();
ObservableCollection<Goods> goods = new ObservableCollection<Goods>();