【问题标题】:C# general questions for threads and multithreading in WPF [closed]WPF中线程和多线程的C#一般问题[关闭]
【发布时间】:2016-01-07 10:19:04
【问题描述】:

您好,我正在寻找一些关于 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 代码中调用这个类(以及在哪里)?也许你知道一些关于这个主题的好教程或书籍。

非常感谢!

【问题讨论】:

  • 一般来说,在 WPF 中,当你在 UI 线程以外的线程上执行时,你需要使用Dispatcher.Invoke
  • 我发布了一个问题的答案,可以澄清你对此的一些事情,看看这个stackoverflow.com/a/33671288/1728469
  • 试着问一个问题。想出有用的答案会容易得多。

标签: c# multithreading performance


【解决方案1】:

我不明白什么时候必须调用,什么时候不需要。

在 UI 应用程序中,有 1 个线程处理所有 UI 渲染。这通常是您的应用程序启动的主线程(有关更多信息,请参阅Message Pump)。根据经验,您不想在此线程中做任何繁重的工作,因为当您这样做时,无法处理其他消息。这意味着您的 UI 变得迟钝且反应迟钝。

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

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

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

在真正需要之前不要优化,您提到的内容可能在性能方面并不重要。在这个阶段,我将专注于设计可测试的代码和编写测试,而不是性能。当您有明显的性能问题时,您可以使用工具来帮助诊断瓶颈,例如来自 RedGate 或 JetBrains 的分析器。

【讨论】:

  • 我要添加一个细节:正如我在上面提到的答案中解释的那样,我发布到另一个问题,使用 WPF 中的内置数据绑定执行的“ui 更新”不需要特别注意(无需使用调用),因为“属性更改”相关的东西由 WPF 框架本身在 UI 级别自动编组
猜你喜欢
  • 1970-01-01
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多