请帮忙,我需要在类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();
答案 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如何工作以及如何使用它们的文章。