触发在X毫秒后启动的操作

bos*_*sco 16 c# mvvm task-parallel-library portable-class-library xamarin.forms

我正在开发一个Xamarin Forms移动应用程序,它有一个包含SearchBar,ListView和Map控件的页面.列表视图包含一个地址列表,这些地址在地图上反映为引脚.

当用户在SearchBar中键入时,ListView会自动更新(通过ViewModel绑定).过滤列表数据源的ViewModel方法看起来像这样......

void FilterList()
{
    listDataSource = new ObservableCollection<location>(
        locationData.Where(l => l.Address.Contains(searchBar.Text))
    );

    // ***** Now, update the map pins using the data in listDataSource
}
Run Code Online (Sandbox Code Playgroud)

我希望更新Map,因为ListView被过滤,但不是在每个按键上,因为这可能每秒发生多次.基本上,我想在更新Map之前在每个FilterList事件中进行"滚动暂停".在伪代码中......

    // ***** Now, update the map pins using the data in listDataSource
    if (a previously-requested map update is pending)
    {
        // Cancel the pending map update request
    }

    // Request a new map update in 1000ms using [listDataSource]
Run Code Online (Sandbox Code Playgroud)

可以使用可移植类库中提供的Stopwatch类来完成此操作,但我怀疑使用Tasks可以实现更清晰/更好的方法.

任何人都可以建议一个"更聪明" PCL兼容的方式来做到这一点?

Rui*_*nho 17

你可以试试 :

await Task.Delay(2000);
Run Code Online (Sandbox Code Playgroud)

  • Task.Delay在PCL(和Profile7)中可用,并且存在带有CancellationToken的重载. (3认同)
  • 我使用Xamarin.Forms延迟我的动画,所以我可以保证它的工作原理. (3认同)

dan*_*dan 12

就像你说的那样,这可以通过非常简洁的方式使用Tasks和异步编程来完成.

您将需要阅读它:http://msdn.microsoft.com/en-us/library/hh191443.aspx

这是一个例子:

public async Task DelayActionAsync(int delay, Action action) 
{
    await Task.Delay(delay);

    action();
}
Run Code Online (Sandbox Code Playgroud)


Har*_*dra 10

这就是我所做的,它适用于我的Xamarin Form应用程序.

    public string Search
    {
        get { return _search; }
        set
        {
            if (_search == value)
                return;

            _search = value;
            triggerSearch = false;
            Task.Run(async () =>
            {
                string searchText = _search;
                await Task.Delay(2000);
                if (_search == searchText)
                {
                    await ActionToFilter();
                }
            });
        }
    }
Run Code Online (Sandbox Code Playgroud)

我把这个'搜索'属性绑定到我的输入字段.每当用户过滤某些内容时,代码会等待1秒钟,然后将新的"文本"字段与之前1秒之前的字段进行比较.假设字符串相等意味着用户已停止输入文本,现在可以触发代码进行过滤.


Edw*_*rey 2

简单延迟的问题在于,当延迟到期时,您可能会收到一堆排队等待的事件。您可以添加逻辑来丢弃延迟运行时引发的事件。如果你想在更高层次上声明逻辑,你可以使用Reactive Extensions