请帮忙,我需要使用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