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

时间:2013-11-30 10:48:09

标签: c# async-await c#-5.0

请帮忙,我需要在类MainPage中使用类UserLocation中的Geoposition pos变量,但它一直返回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;
        }

    }

然后在类MainPage

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

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

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

//然后

使用p = LocationData.getPosition();

2 个答案:

答案 0 :(得分:3)

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

我可以建议

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

然后你必须从异步proc

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

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

答案 1 :(得分:2)

问题是你的方法preparePosition是异步的。它以异步方式检索“pos”的值,但您正在使用它而不等待其结果。

首先,将preparePosition签名更改为:

async public Task preparePosition()
{
...
}

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

然后将getPosition更改为:

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

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