Способ, которым я делал подобные вещи раньше, - это использование таймера.Каждый раз, когда значение TrackBar изменяется, сбрасывайте таймер так, чтобы он срабатывал за 500 мс (или любой другой, подходящий для вас).Если пользователь изменяет значение до того, как таймер сработает, он будет сброшен снова, а это означает, что, даже если он меняется несколько раз, таймер сработает только один раз.запускать в другом потоке, и вы не сможете обновить пользовательский интерфейс из этого потока, поэтому вам придется вернуться обратно в поток пользовательского интерфейса, чтобы внести в него изменения.Тем не менее, если вы сможете переместить большую часть вашей дорогой работы в этот фоновый поток, вы будете дольше поддерживать отзывчивый интерфейс.
Вот пример кода, который должен дать вам некоторое представление о том, что я имею в виду.
public partial class Form1 : Form
{
private int updateCount;
private System.Threading.Timer timer;
public Form1()
{
this.InitializeComponent();
this.timer = new System.Threading.Timer(this.UpdateValue);
}
private void UpdateValue(object state)
{
// Prevent the user from changing the value while we're doing
// our expensive operation
this.Invoke(new MethodInvoker(() => this.trackBar1.Enabled = false));
// Do the expensive updates - this is still on a background thread
this.updateCount++;
this.Invoke(new MethodInvoker(this.UpdateUI));
}
private void UpdateUI()
{
this.label1.Text = this.updateCount.ToString();
// Re-enable the track bar again
this.trackBar1.Enabled = true;
}
private void trackBar1_ValueChanged(object sender, EventArgs e)
{
this.timer.Change(TimeSpan.FromMilliseconds(500), new TimeSpan(-1));
}
}
Редактировать: Вот решение, которое использует таймер выигрышных форм, чтобы сделать время.Разница здесь в том, что вы заблокируете пользовательский интерфейс во время выполнения вычислений;это может или не может быть хорошо в вашей ситуации.
public partial class Form1 : Form
{
private int updateCount;
private Timer timer;
public Form1()
{
this.InitializeComponent();
this.timer = new Timer();
this.timer.Interval = 500;
this.timer.Tick += this.Timer_Tick;
}
private void Timer_Tick(object sender, EventArgs e)
{
this.timer.Stop();
this.updateCount++;
this.label1.Text = this.updateCount.ToString();
}
private void trackBar1_ValueChanged(object sender, EventArgs e)
{
this.timer.Stop();
this.timer.Start();
}
}