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