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

C# 在另一个类中初始化的变量从另一个类访问时返回null,c#,async-await,c#-5.0,C#,Async Await,C# 5.0,请帮助,我需要使用Geoposition pos变量,该变量位于类主页中的类UserLocation中,但它始终返回null,此方法初始化pos public Geoposition pos; async public void preparePosition() { try { // Get the cancellation token. _cts = new CancellationTokenSo

请帮助,我需要使用Geoposition pos变量,该变量位于类主页中的类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是异步的。它异步检索“pos”的值,但您正在使用它而不等待其结果

首先,将preparePosition签名更改为:

async public Task preparePosition()
{
...
}
然后它返回任务而不是void,您可以等待任务完成

然后将getPosition更改为:

public Geoposition getPosition()
{
    preparePosition().Wait();
    return pos;
}
我建议阅读一些关于async/Wait如何工作以及如何使用它们的文章

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

我可以建议吗

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

当然,你只能说
using(var p=…
如果
p
实现了
IDisposable

我很确定可能发生了一些异常,所有代码都进入
preparePosition()中的
catch
块中
使用异步方法几乎总是错误的。同意,但在这种情况下,这是一种确保“pos”有值的方法。整个概念应该改变,我只是提供了问题的答案。使用Wait()时,应用程序会被困在按钮事件中
public async void MyButtonClick(sender, e){
  using (var p = await preparePosition()){
    ...
  }
}