Posts Tagged ‘.net’

.NET 2.0数据绑定纯粹是垃圾

我在开发WinForm应用程序的时候很少使用数据绑定,以前也没有怎么用过。今天在做一个参数设置面板的时候用到了他。然而很令我失望,它不仅没有解决问题,而且还带来了严重的问题,让我找了好半天,最后确认是BUG。当然也不是我一个人遇到了,看看这篇文章,他们也遇到了相同问题。

问题描述起来是这样的:

我有一个这么样一个Class:

[csharp]
public class BindTest
{
private int number = 5;

private int anotherNumber = 10;

public int Number
{
get { return number; }
set { number = value; }
}

public int AnotherNumber
{
get { return anotherNumber; }
set { anotherNumber = value; }
}
}
[/csharp]

窗体上有两个控件,一个是textBox1,绑定Number属性,另一个是textBox2,绑定AnotherNumber属性。由于我需要“确认”和“取消”按钮,所以我在高级绑定里面将两个控件的绑定行为改为Never,也就是不更新它的值。

按照MSDN里面阐述的,使用Binding的WriteValue()方法就可以将数据更新。在我的程序里面可以这样写:textBox1.DataBinding[0].WriteValue();

textBox2类似的做法。

后来一运行,问题就出来了,仅仅能够将textBox1的值更新,而textBox2的值还原了!!!

一番搜索以后又回到了刚开始的那篇讨论中,有人这么说道:

As to the problem above this comment, it is a common malfunction of databinding. Simply, if you attempt to control the writing/reading behavior of Binding class, it will --REVERT-- changes of all other non-bound fields/properties. Therefore, only first bound control gets updated due to the fact it is the only one which has access to CHANGED data, after its done with the update, it reverts the changes back thus canceling them, so other bindings are useless.

大意是“这是数据绑定的一个故障。简而言之,试图操作绑定类的写入和读取行为,它回将所有的未绑定的字段和属性还原。因此,仅仅只有第一个被绑定的对象能够得到修改了的数据,在它完成刷新操作之后,它将所有的修改还原因此就取消了其他控件的修改,因此绑定是无用的”

理解了以后,就明白了,我得重新手动写了,哎,数据绑定真是讨厌啊。

解决.NET应用程序效率问题

.NET应用程序一直以开发速度快、IDE功能强大作为卖点,理所当然我这种智商不高又期望快速开发的人当然首选它了。第一次尝试用.NET做整个机床的控制程序,平台不是太强大,赛扬2.4的CPU和512的内存,基本上够跑。经历两个多月的开发把底层的功能基本完善了,控制台程序看不出效率的问题,我很放心的使用WINDOWS FORMS完成剩下的界面。

当做到一定程度的时候,效率问题就逐步显现出来了,GUI界面很缓慢,令人很抓狂。在尝试了很多的方法和优化后,最终还是要到及床上进行实际的调试。昨天忙了一天,终于找到了问题所在。过程我就不详细多说了,解决问题最根本的还是找准了病根。

有时候我们可能想WINDOWS FORMS的GUI性能不太好,界面刷新老是很缓慢,比起MFC的程序有时候慢很多。当然这里有一些GUI库的问题,我们只能从另外的一面去优化。但其实微软已经做的够好,而很大程度上取决于我们怎么使用它。

找病根,有两种方法:一种是庸医所用的乱证乱下药,偶尔有效;一种是西医的科学化的方法,用数据说话。在当了一阵庸医以后,终于想尝试用工具来解决问题。

Resharper很可能很多人都用过吧,JetBrains公司还有一款产品用于性能分析的——dotTRACE。此工具比VS自带的性能测试工具好用多了。我用这个工具详细一测,立刻就找到了病根所在。当然选择正确的测试模式还是很有必要的,由于我开得多线程,所以需要用针对线程的测试模式,才能测得线程中函数调用的时间。

真是一针见血,找到了问题所在,立刻解决问题。

最后总结一下:

1、不要盲目找问题,要找到工具来,用数据说话。

2、.NET GUI库有一些小的方面有性能问题(比如DataGridView等控件,但其实用好了速度还是很快的),但不足以影响到正常的工作,很多时候都是自己用法没对造成的。

C#工控

晚上终于完成了数控钻床Excellon格式的钻床文件的初步解析,能够将文件中的钻孔信息提取出来。另外还做了一个GUI工具,使数据能够可视化的显示出来。这周的任务也就暂告一段落,下周要去厂里面调试,这是我写的C#版本的第一个测试。

说来这个数控钻铣床项目在一开始还真是一波三折,最开始厂家说的是要的是一个支持Win98的版本, Read More

锁定进程只用一个CPU

昨天调试OSG程序的时候很郁闷啊,好像是OSG有一些BUG,我那个程序如果在多个CPU上运行的话就会出现一些莫名其妙的问题。我想可能是线程争用的问题。我在任务管理器里面将程序设置为只使用一个CPU,问题就解决了,很奇怪。现在还没有时间找什么原因引起的,而每次调试都要去设置CPU关系很麻烦。只好写了一个小程序,将进程锁定在一个CPU上面,等有空了再来看到底怎么回事。 Read More

走过路过不要错过——手机电话簿和短信操作示例程序

这是去年10月份写的一个大程序中的一部分,由于各种原因没有实际的完成。今天收到一个外国朋友的来信,说需要短信这部分的代码,我就顺便把程序整理了一下公布出来,供大家参考学习: Read More