我有一个滑块,滑块的值更改我需要执行一些计算。由于计算需要100-200毫秒,因此滑块会被卡住。有没有办法让这些计算背景(在这种情况下,我需要从主线程访问一些值)并仍然显示最新的输出。
答案 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()方法本身。)
此外,当您开始计算时,阻止滑块直到计算完成是有意义的,因为用户可能会一次又一次地更改它。