0

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

4

2 回答 2

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()方法本身)。

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

于 2013-10-24T10:47:10.783 回答
0

从 BackgroundWorker 线程,您可以访问主线程

Application.Current.Dispatcher

在代码中你可以像 function X(int newSliderValue) { UpdateUI(() => { SliderControl.Value = newSliderValue; }); }

对调度员的调用看起来像

private void UpdateUI(Action methode)
{
    Application.Current.Dispatcher.Invoke(methode, DispatcherPriority.Normal);
}
于 2013-10-24T10:28:00.203 回答