在另一个类中初始化的变量在从另一个访问时返回null



请帮忙,我需要使用Geoposition pos变量,该变量位于类MainPage中的UserLocation类中,但它一直返回null,此方法初始化pos,

public Geoposition pos;
    async public void preparePosition()
    {
        try
        {
            // Get the cancellation token.
            _cts = new CancellationTokenSource();
            CancellationToken token = _cts.Token;
            //MessageTextbox.Text = "Waiting for update...";
            // Get the position to derive the coordinates
            _geolocator.DesiredAccuracy = Windows.Devices.Geolocation.PositionAccuracy.High;
            pos = await _geolocator.GetGeopositionAsync().AsTask(token);
        }
        catch (System.UnauthorizedAccessException)
        {
        }
        catch (TaskCanceledException)
        {
        }
        finally
        {
            _cts = null;
        }
    }

然后在课堂主页

UserLocation LocationData = new UserLocation();
 Geoposition p = LocationData.pos;

但是它返回null,iv也尝试使用返回方法

    public Geoposition getPosition()
    {
        preparePosition();
        return pos;
    }

//然后

使用p=LocationData.getPosition();

preparePosition()是异步的,因此它在GPS硬件获取位置之前返回。

我能推荐吗

public async Task<GeoPosition> PreparePosition()
    {
        ...
        return pos;
    }

然后您必须从异步进程调用它

public async void MyButtonClick(sender, e){
  using (var p = await preparePosition()){
    ...
  }
}

当然,如果p实现IDisposable,则只能说using (var p= ...

问题是您的方法preparePosition是异步的。它异步检索"pos"的值,但您在使用它时没有等待结果。

首先,将preparePosition签名更改为:

async public Task preparePosition()
{
...
}

然后它返回Task而不是void,您可以等待它完成。

然后将getPosition更改为:

public Geoposition getPosition()
{
    preparePosition().Wait();
    return pos;
}

我建议阅读一些关于async/await如何工作以及应该如何使用它们的文章。

  • http://msdn.microsoft.com/en-us/library/vstudio/hh156528.aspx
  • http://msdn.microsoft.com/en-us/library/vstudio/hh191443.aspx

最新更新