【问题标题】:Canceling async call in property取消属性中的异步调用
【发布时间】:2016-06-23 23:18:14
【问题描述】:

我正在开发一个使用位置解析地址的 UWP MVVM 应用程序:

private async void ResolveAddress()
{
    //TODO : Manage cancel
    Debug.WriteLine("Resolving adress ...");
    var result = await MapLocationFinder.FindLocationsAtAsync(SelectedLocation);
    if (result.Status == MapLocationFinderStatus.Success)
    {
        if (result.Locations.Count > 0)
        {
            Debug.WriteLine("Adress resolved : " + Address);
            Address = result.Locations[0].Address.FormattedAddress;
        }
    }
    Debug.WriteLine("Resolve fail");
}

此调用可能非常频繁地发生(基于用户选择的位置),因此在进行其他调用时该方法可能尚未完成运行。

//Binding property
public Geopoint SelectedLocation
{
    get { return _selectedLocation; }
    set
    {
        Debug.WriteLine("Location change");
        _selectedLocation = value;
        ResolveAddress();
        RaisePropertyChanged();
    }
}

Adress 字段也是一个绑定属性。

我在这个实现中遇到了 2 个问题:

  • 我不确定地址字段是否是最后选择的位置(呼叫 N-1 可以在 N 之后完成)。
  • 地址字段逐步包含所有已解析的地址,我只想要最后一个。

我找到了取消异步任务的方法:

https://msdn.microsoft.com/fr-fr/library/jj155759.aspx

但 MapLocationFinder.FindLocationsAtAsync 在参数中没有取消标记。

最好的方法是什么?

谢谢。

【问题讨论】:

  • 在属性集上调用异步函数不是一个好习惯。尝试改变任何事件。要么在SelectionChanged 活动上,要么是这样做的最佳场所

标签: c# mvvm async-await uwp


【解决方案1】:

我不确定地址字段是否是最后选择的位置(呼叫 N-1 可以在 N 之后完成)。

您可以通过asynchronous callback token 解决此问题。我在一篇非常古老的博客文章中更详细地描述了它,我称它们为“异步回调上下文”。考虑到“上下文”这个词在今天已经被过度使用了,我现在更喜欢“令牌”这个词。

private object _addressCallbackToken;

private async void ResolveAddress()
{
  Debug.WriteLine("Resolving adress ...");
  var token = _addressCallbackToken = new object();
  var result = await MapLocationFinder.FindLocationsAtAsync(SelectedLocation);
  if (token != _addressCallbackToken)
    return;
  if (result.Status == MapLocationFinderStatus.Success)
  {
    if (result.Locations.Count > 0)
    {
      Debug.WriteLine("Adress resolved : " + Address);
      Address = result.Locations[0].Address.FormattedAddress;
    }
  }
  Debug.WriteLine("Resolve fail");
}

但是,我强烈建议不要以这种方式使用async void。您可能会发现我在async MVVM data binding 上的文章很有用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多