C#中WPF中线程和多线程的常见问题

时间:2016-01-07 10:19:04

标签: c# multithreading performance

您好我正在寻找一些关于c#编码的基本信息,尤其是WPF。

首先,当我必须使用Invoke更新WPF中的表单组件时,我真的不明白。

例如,如果您有一个简单的按钮点击事件,您通常会在其中执行以下操作:

this.label1.content = this.dataObject.Position;

但是,例如,如果您轮询大量数据,则通常会调用标签1。

我不明白何时必须调用,何时不调用。它依赖于我的dataObject实例吗?例如,当我有我的WPF表单和我的项目中另一个名为dataObject.cs的类时,我用

初始化这个类
private dataObject dataO = new dataObject();

在我的WPF表单中,当我使用它时,我是否必须调用它,因为它是另一个类?或者更确切地说,我不必调用它,因为它在我的gui中初始化,因此GUI线程无论如何都在处理类?那么在哪些情况下我必须调用一个数据对象?

其次,我想获得有关如何在c#中提高性能和数据分配的信息。例如,我在gui中的哪个位置声明新线程,变量等以获得最佳性能?我在哪里初始化它们?什么时候建议创建另一个处理我所有参数的类,如何在我的WPF代码中调用这个类(以及在哪里)?也许你知道一些关于这个主题的一般的教程或书籍。

非常感谢!

1 个答案:

答案 0 :(得分:2)

  

我不明白何时必须调用,何时不调用。

在UI应用程序中,有1个线程处理所有UI呈现。这通常是应用程序启动的主要线程(有关详细信息,请参阅Message Pump)。根据经验,您不希望在此线程中执行任何繁重的工作,因为当您这样做时,不能处理任何其他消息。这意味着你的用户界面变得迟钝和反应迟钝。

如果是快速更新,您可以在主UI线程中执行此操作。如果操作需要很长时间 - 请在另一个Invoke的线程中执行。

Invoke的另一个用途是当您需要从非UI线程更新UI状态时。

  

其次,我想获得有关如何在c#中提高性能和数据分配的信息。

不要优化直到真正需要,你提到的东西在性能方面可能并不重要。在这个阶段,我专注于设计可测试代码和编写测试,而不是性能。当您遇到明显的性能问题时,您可以使用工具来帮助诊断瓶颈,例如:来自RedGate或JetBrains的个人资料。