WPF中的简单线程

时间:2010-03-17 21:47:48

标签: c# wpf multithreading

我一直在阅读很多关于C#,WPF和Silverlight中的线程,但无法让它工作。

我的主要问题是我有_load(_Initialized)动作并且它有很多对象创建,并且我有定时器工作做不同的事情,这会导致程序的启动时间非常慢并且显然会导致要挂起的UI,这对于部署到很多用户来说并不是一件好事。

我的定时器更改了标签和文本字段的值,但让他们在另一个线程上执行此操作显然是不行的。

那么有人能给我一些关于如何实现我需要做的事情的例子吗?

由于

2 个答案:

答案 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;
    }));
}

这些都是从更大的方法中删除的,它们可能会稍微优化一下。不过,这会给你一个开始的地方。