【问题标题】:Scroll event is triggered after Task Delay任务延迟后触发滚动事件
【发布时间】:2021-02-06 20:17:33
【问题描述】:

我试图避免多次调用以消耗 ListView 滚动上的休息服务,但它似乎不起作用..

问题

滚动ListView时,连续触发scroll事件,多次调用rest服务。

方法

我决定在一个单独的线程中调用服务,延迟 11 秒

期待

调用服务后,busy 属性仍设置为 true 11 秒,因此即使触发滚动事件,它也不会调用服务,因为busy 属性为 true。

结果

该服务被调用一次,但 11 秒后再次触发滚动事件并再次调用该服务。

编辑

我开始滚动,并且事件被多次点击,因为每次滚动 Y 值的变化都会触发事件,导致调用服务 5 次(我想要调用服务 1 次)

例如:

请注意,初始滚动 y 值为 0。我滑动以滚动它。 假设滑动后滚动值为 5(事件被击中 5 次),因此我尝试解决问题是使用任务在单独的线程中调用服务,但发生的是事件被触发并运行任务调用服务,因为它在不同的线程上运行,所以它立即完成了事件(我的意思是我退出了事件),11 秒后再次触发事件,依此类推..

那么会发生什么

我想要的是调用其余服务 1 次,而不是 5 次。

private void Scrollview_Scrolled(object sender, ScrolledEventArgs e)
    {
        Task.Run(async () =>
        {
                if (IsBusy)
                    return;

                 IsBusy = true;
                 await _services.IDealsMService.GetMoreDealsAsync(param1, param2);
                 await Task.Delay(TimeSpan.FromSeconds(11));
         }
     }

【问题讨论】:

  • @Cfun 不,它没有,我不需要它,因为我不等待任务..
  • 所以你想限制或消除事件?所以它每 11 秒最多触发一次?
  • 试图进行节流
  • 尝试了类似的方法但没有奏效,我仍然会尝试您的解决方案并让您知道
  • 好吧,我只共享了部分代码,所以问题是我也在以编程方式从单独的线程滚动,这很麻烦..

标签: c# xamarin xamarin.forms scroll async-await


【解决方案1】:

尝试:

bool IsBusy { get; set; } = false;

private async void Scrollview_Scrolled(object sender, ScrolledEventArgs e)
{
    if (IsBusy)
        return;

    IsBusy = true;
    await _services.IDealsMService.GetMoreDealsAsync(param1, param2);
    await Task.Delay(TimeSpan.FromSeconds(11));     
    IsBusy = false;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多