异步/等待初学者

时间:2014-12-28 08:55:19

标签: c# .net asynchronous async-await

我有一个使用GeoLocator查找用户位置的应用。 它看起来像这样:

public async (not sure what to put here) Cordinates()
{
    if (_geolocator == null)
    {
        _geolocator = new Geolocator();
    }

    Geoposition _Position = await locator.GetGeopositionAsync();
}

我还有一个字符串属性,我想用它来描述过程。

public string Status {get; set}

例如,当Cordinates()开始时,字符串值应为"正在搜索..."当Cordinates()完成后,它可以说"完成"

我认为这是我应该使用await / async的情况,但我可以使用一些帮助来解决它。

2 个答案:

答案 0 :(得分:3)

如果您返回某些内容,则应将返回类型设置为Task<T>;如果不返回任何内容,则应将Task设置为void。例如,如果您有return _position;之类的行,那么您应该将函数的返回类型设为Task<Geoposition>,或者如果您有return 0,则应将其更改为Task<int>,如果你只是不返回任何内容,或只是return只使用Task

public async Task<your return type> or Task if return type is void Cordinates()
{
    if (_geolocator == null)
    {
        _geolocator = new Geolocator();
    }
    this.Status = "Searching..."; // seting status and awaiting your async GetGeoposition
    Geoposition _Position = await locator.GetGeopositionAsync();
    this.Status = "Done"; // after GetGeoposition is finidshed you are here and setting status to done
}

答案 1 :(得分:1)

我认为你应该在使用之前阅读async / await和threading的基础知识。 一个好的开始可能是Stephen's post here

要修复您的代码,它将是这样的(另请参阅MSDN以供参考):

public async Task<Geoposition> Cordinates()
{
  if (_geolocator == null)
  {
    _geolocator = new Geolocator();
  }

  Geoposition _Position = await locator.GetGeopositionAsync();
}

Status中,您将检查当前位置是否已被查询过。根据它,返回您选择的字符串值。那里没有异步操作。或者,在等待地理定位的前后设置雕像。