滑块在C#中更改时执行后台操作

时间:2013-10-24 10:21:12

标签: c# multithreading process slider backgroundworker

我有一个滑块,滑块的值更改我需要执行一些计算。由于计算需要100-200毫秒,因此滑块会被卡住。有没有办法让这些计算背景(在这种情况下,我需要从主线程访问一些值)并仍然显示最新的输出。

2 个答案:

答案 0 :(得分:0)

在BackgroundWorker Thread中,您可以使用

访问主线程
Application.Current.Dispatcher

在代码中你可以这样     函数X(int newSliderValue)     {         UpdateUI(()=> {SliderControl.Value = newSliderValue;});     }

对调度员的调用看起来像

private void UpdateUI(Action methode)
{
    Application.Current.Dispatcher.Invoke(methode, DispatcherPriority.Normal);
}

答案 1 :(得分:0)

如果您的长计算是IO边界操作,最好的方法是使用async / await功能。将处理程序标记为异步,而不是使用async / await:

        var res = await Task.Run(() =>
                {
                    Thread.Sleep(2000); // perform long calculation
                    return e.NewValue*2;
                }
            );
        MessageBox.Show(res.ToString(CultureInfo.InvariantCulture));

请注意,在操作完成后,您不需要某种调用来访问GUI线程。

如果您的操作是CPU限制的,您可以使用以下任务:

        var t = Task.Run(() =>
        {
            Thread.Sleep(2000); // perform long calculation
            return e.NewValue*2;
        }).ContinueWith(task => Dispatcher.Invoke(() => MessageBox.Show(task.Result.ToString(CultureInfo.InvariantCulture))));

注意在这种情况下我使用WPF的调度程序(在winform Form类中有 Invoke()方法本身。)

此外,当您开始计算时,阻止滑块直到计算完成是有意义的,因为用户可能会一次又一次地更改它。