我一直在阅读很多关于C#,WPF和Silverlight中的线程,但无法让它工作。
我的主要问题是我有_load(_Initialized)动作并且它有很多对象创建,并且我有定时器工作做不同的事情,这会导致程序的启动时间非常慢并且显然会导致要挂起的UI,这对于部署到很多用户来说并不是一件好事。
我的定时器更改了标签和文本字段的值,但让他们在另一个线程上执行此操作显然是不行的。
那么有人能给我一些关于如何实现我需要做的事情的例子吗?
由于
答案 0 :(得分:2)
将您的工作推送到其他线程,并使用Dispatcher.Invoke将标签和文本字段的设置封送回UI线程。
话虽如此,如果可以,您也可以重构您的工作以使用BackgroundWorker class。进度和完成事件已经封送回UI线程,因此在许多情况下更容易更新UI。
答案 1 :(得分:1)
诀窍是你的UI逻辑必须在UI线程上执行。提供的方法使其比原本更容易,但使用它们可能会很棘手。以下是我过去的做法:
首先,您必须声明一个可以提供给Dispatcher.Invoke方法的委托:
private delegate void UIDelegate();
然后,您可以设置后台工作程序并将其命名为RunWorkerAsync方法:
BackgroundWorker loadWorker = new BackgroundWorker();
loadWorker.DoWork += new DoWorkEventHandler(loadWorker_DoWork);
loadWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(loadWorker_RunWorkerCompleted);
loadWorker.RunWorkerAsync();
然后,要更新UI元素,您必须调用其调度程序:
private void changeStatusLabel(string status)
{
progressLabel.Dispatcher.Invoke(new UIDelegate(delegate
{
progressLabel.Content = status;
}));
}
这些都是从更大的方法中删除的,它们可能会稍微优化一下。不过,这会给你一个开始的地方。