我有一个 WPF 应用程序,它很慢。
它不是渲染。首先,渲染非常简单,其次,我用 WPF Performance Toolkit 查看了它 - 没什么。
在我自己的代码中不。首先,单元测试运行速度很快,其次,如果我将所有 DataTemplates 替换为空白,一切都运行得很快。
到目前为止,看起来比较慢的部分是模板实例化。也就是说,当您启动应用程序并打开一些复杂的屏幕时,会花费很多时间。我所说的“很多”是指“很多”。有时可能长达 3-5 秒 - 例如,当有一个包含 100 行的数据网格时。但是,当您转到另一个选项卡,然后返回同一屏幕时,它会快速打开(只要其 View 模型保持原样)。
这很烦人,不仅因为它很慢,而且因为我对此无能为力。如果我能控制缓慢,我也许可以显示一些“正在打开,请稍候”消息或其他内容...
此外,当我查看其他一些 WPF 应用程序(最著名的是 ILSpy)时,尽管数据量很大,但它们似乎运行得相当快。这让我相信我可能做错了什么。但我不知道从哪里开始。
有什么想法吗?有什么经典错误吗?有什么建议吗?
最佳答案
我的经验来自于开发 WPF 思维导图应用程序 NovaMind
几个月前,我们完全重写了中间层以解决我们遇到的性能问题。简而言之,创建我们的用户控件似乎是减慢速度的方式。不幸的是,我找不到一个很好的方法来分析性能,因为 WPF Performance Suite 和商业应用程序(如 ANTS Profiler)都没有为您提供有关 WPF 过程的这一部分的任何详细信息。 (我当时问过this question)
我们通过反复试验来手动测试我们的应用程序,并删除了我们的部分用户控件,以查看究竟是什么是罪魁祸首。
最后,我们通过完全重写控件解决了性能问题。我们还大大降低了视觉树的复杂性。在重写之前,我们最常用的用户控件之一,当使用 Snoop 检查时,包含 61 个不同的东西,现在只有 3 个。只要有可能,我们只按需向可视化树中添加东西。 (如您所知,在 XAML 中,即使将内容设置为 Collapsed,也需要先创建它们)。 最后,我们被迫编写自己的富文本呈现控件,因为内置的 RichtextBox 速度非常慢,而且 RichtextBox 的可视化树非常复杂。
我不知道这是否适用于您的情况,但我建议您调查您的用户控件并查看它们是否复杂。也许你有可以修剪的东西。 低垂的果实将是很少见的部分,或者可以以懒惰的方式创建。您可以在必要时从代码隐藏创建这些部分,而不是将它们放在 XAML 中。这应该对您有很大帮助。
否则,如果可能的话,虚拟化是你的 friend 。不幸的是,我们无法做到这一点。
关于c# - WPF:缓慢的模板实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5790380/
我正在使用puppet为ruby程序提供一组常量。我需要提供一组主机名,我的程序将对其进行迭代。在我之前使用的bash脚本中,我只是将它作为一个puppet变量hosts=>"host1,host2"我将其提供给bash脚本作为HOSTS=显然这对ruby不太适用——我需要它的格式hosts=["host1","host2"]自从phosts和putsmy_array.inspect提供输出["host1","host2"]我希望使用其中之一。不幸的是,我终其一生都无法弄清楚如何让它发挥作用。我尝试了以下各项:我发现某处他们指出我需要在函数调用前放置“function_”……这
我正在查看instance_variable_set的文档并看到给出的示例代码是这样做的:obj.instance_variable_set(:@instnc_var,"valuefortheinstancevariable")然后允许您在类的任何实例方法中以@instnc_var的形式访问该变量。我想知道为什么在@instnc_var之前需要一个冒号:。冒号有什么作用? 最佳答案 我的第一直觉是告诉你不要使用instance_variable_set除非你真的知道你用它做什么。它本质上是一种元编程工具或绕过实例变量可见性的黑客攻击
在我的应用程序中,我需要能够找到所有数字子字符串,然后扫描每个子字符串,找到第一个匹配范围(例如5到15之间)的子字符串,并将该实例替换为另一个字符串“X”。我的测试字符串s="1foo100bar10gee1"我的初始模式是1个或多个数字的任何字符串,例如,re=Regexp.new(/\d+/)matches=s.scan(re)给出["1","100","10","1"]如果我想用“X”替换第N个匹配项,并且只替换第N个匹配项,我该怎么做?例如,如果我想替换第三个匹配项“10”(匹配项[2]),我不能只说s[matches[2]]="X"因为它做了两次替换“1fooX0barXg
我有一个正在构建的应用程序,我需要一个模型来创建另一个模型的实例。我希望每辆车都有4个轮胎。汽车模型classCar轮胎模型classTire但是,在make_tires内部有一个错误,如果我为Tire尝试它,则没有用于创建或新建的activerecord方法。当我检查轮胎时,它没有这些方法。我该如何补救?错误是这样的:未定义的方法'create'forActiveRecord::AttributeMethods::Serialization::Tire::Module我测试了两个环境:测试和开发,它们都因相同的错误而失败。 最佳答案
我正在处理旧代码的一部分。beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)endRubocop错误如下:Avoidstubbingusing'allow_any_instance_of'我读到了RuboCop::RSpec:AnyInstance我试着像下面那样改变它。由此beforedoallow_any_instance_of(SportRateManager).toreceive(:create).and_return(true)end对此:let(:sport_
如何在ruby中调用C#dll? 最佳答案 我能想到几种可能性:为您的DLL编写(或找人编写)一个COM包装器,如果它还没有,则使用Ruby的WIN32OLE库来调用它;看看RubyCLR,其中一位作者是JohnLam,他继续在Microsoft从事IronRuby方面的工作。(估计不会再维护了,可能不支持.Net2.0以上的版本);正如其他地方已经提到的,看看使用IronRuby,如果这是您的技术选择。有一个主题是here.请注意,最后一篇文章实际上来自JohnLam(看起来像是2009年3月),他似乎很自在地断言RubyCL
我正在尝试在Ruby中复制Convert.ToBase64String()行为。这是我的C#代码:varsha1=newSHA1CryptoServiceProvider();varpasswordBytes=Encoding.UTF8.GetBytes("password");varpasswordHash=sha1.ComputeHash(passwordBytes);returnConvert.ToBase64String(passwordHash);//returns"W6ph5Mm5Pz8GgiULbPgzG37mj9g="当我在Ruby中尝试同样的事情时,我得到了相同sha
我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.
我正在使用Mandrill的RubyAPIGem并使用以下简单的测试模板:testastic按照Heroku指南中的示例,我有以下Ruby代码:require'mandrill'm=Mandrill::API.newrendered=m.templates.render'test-template',[{:header=>'someheadertext',:main_section=>'Themaincontentblock',:footer=>'asdf'}]mail(:to=>"JaysonLane",:subject=>"TestEmail")do|format|format.h