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