C# 在另一个类中初始化的变量从另一个类访问时返回null
请帮助,我需要使用Geoposition pos变量,该变量位于类主页中的类UserLocation中,但它始终返回null,此方法初始化posC# 在另一个类中初始化的变量从另一个类访问时返回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
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如何工作以及如何使用它们的文章
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()){
...
}
}