C#Queue最新的异步任务

时间:2017-10-05 22:27:05

标签: wpf task-parallel-library

我正在开发一个WPF应用程序,在这个应用程序中,只要绑定到滑块的数据属性发生变化,我就需要执行冗长的操作。是否有一种简单的方法可以为此操作排队异步任务,但是确保只运行最近排队的任务?

3 个答案:

答案 0 :(得分:3)

您可以使用单个任务,取消它,然后使用新任务重新分配。任务可以延迟链接去抖动滑块:

CancellationTokenSource cancel;
Task task;
...

cancel?.Cancel();
cancel?.Dispose();
cancel = new CancellationTokenSource();
task = Task.Delay(3000, cancel.Token).ContinueWith(...);

答案 1 :(得分:0)

我设法通过使用Task.ContinueWith()创建任务链来解决我的问题。线程安全计数器确保只有链中的最后一个任务实际运行。

using System;
using System.Threading;
using System.Threading.Tasks;

namespace WpfApp1
{
    public class AsyncTaskRunner
    {
        #region Member Variables

        Task m_TaskChain;
        int m_TaskCount;

        #endregion

        #region Constructors

        public AsyncTaskRunner()
        {
            //Initialize the member variables
            m_TaskChain = Task.CompletedTask;
            m_TaskCount = 0;
        }

        #endregion

        #region Public Methods

        public void Run(Action action)
        {
            //Add a continuation to the task chain using the specified action
            Interlocked.Increment(ref m_TaskCount);
            m_TaskChain = m_TaskChain.ContinueWith((prevTask) =>
            {
                //Call the action if we're the last task in the task chain
                if (Interlocked.Decrement(ref m_TaskCount) == 0)
                {
                    action();
                }
            });
        }

        public async Task WaitAsync()
        {
            //Wait for the asynchronous task chain to finish
            await m_TaskChain;
        }

        #endregion
    }
}

答案 2 :(得分:0)

您可以向执行此操作的Binding添加Delay

MSDN特别要求Slider作为使用它的好候选人:

  

如果使用数据绑定来更新数据源,则可以使用   延迟属性以指定在属性之后传递的时间量   源更新之前目标上的更改。例如,假设   你有一个Slider,它的Value属性数据是双向绑定的   到数据对象的属性和UpdateSourceTrigger属性是   设置为PropertyChanged。在这个例子中,当用户移动时   滑块,Slider移动的每个像素的源更新。该   源对象通常只需要滑块的值   滑块的值停止更改。防止更新源   通常,使用Delay指定不应更新源   直到拇指停止移动后经过一定的时间。

可以像这样使用:

<TextBlock Text="{Binding Name, Delay=500}"/>