- 1、本文档共8页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
C# 性能优化最佳实践
1、显式注册的EvenHandler要显式注销以避免内存泄漏
将一个成员方法注册到某个对象的事件会造成后者持有前者的引用。在事件注销之前,前者不会被垃圾回收。
[csharp] view plain copy
private void Form1_Load()
{
……
//注册事件
CommandRemotingContext.CmdChanged += new ReciverCmdStateChangedEventHandler(this.CommandRemotingContext_CmdChanged);
……
}
private void Form1_FromClosed()
{
……
//关闭窗体时及时释放事件
CommandRemotingContext.CmdChanged -= new ReciverCmdStateChangedEventHandler(this.CommandRemotingContext_CmdChanged);
……
}
由事件引起的内存泄漏问题:
对象A订阅了对象B中的事件
对象A的生命周期远远大于对象B
对象A没有取消订阅对象B的时间
最终导致对象B无法释放
2、控件绑定的数据源批量操作应避免自动刷新
客户端批量操作数据时,控件自带的刷新操作,会造成不必要的时间消耗
当数据源(如DataTable、Array、List、ObservableCollection或其他IListSource等)被绑定到控件时,批量操作数据时应该断开绑定或挂起控件的刷新。
[csharp] view plain copy
this.gcBillList.DataSource = null;
DataRowCollection rows = this.ds.Tables[0].Rows;
foreach (DataRow row in rows)
{
// DataRow数据操作
}
this.gcBillList.DataSource = this.ds.Tables[0].DefaultView;
3、减少客户端与服务端的通信次数
WebService调用并非越少越好,传输数据量较大的情况可考虑拆分为多次调用
对于短WebService的调用,应尽量合并以减少交互次数
[csharp] view plain copy
//多次调用了相同的WS
txtCompanyName.Text=SCPubFunctionClient.PublicWSCalstring(“ForTest”, “GetCompanyNameByID”,“0001”); txtCompanyInnerName.Text=SCPubFunctionClient.PublicWSCalstring(“ForTest”, “GetCompanyInnerNameByID”,“0001”);
//合并相邻的WS
string[] result=SCPubFunctionClient.PublicWSCalstring(“ForTest”, “GetCompanyNameAndInnerNameByID”,“0001”);
txtCompanyName.Text=result[0];
txtCompanyInnerName.Text= result[1];
4、减少客户端与服务端的通信次数
如非必要,应尽量避免在循环体内重复调用WebService
[csharp] view plain copy
//循环调用了相同的WS
ListPerson persons;
……
foreach(string personID in personIDs)
{
person=HRPubWsClient.getPerson(personID);
persons.Add(person);
}
//合并WS
ListPerson persons;
……
persons =HRPubWsClient.getPersonList(personIDs);
5、使用泛型来避免装箱、拆箱操作(减少垃圾回收压力)
装箱操作会造成GC压力;如果发生在集合中,应该使用泛型集合避免。
对于值类型的集合,使用ListT来代替ArrayList,使用DictionaryTKey, TValue 来代替Hashtable。
[csharp] view plain copy
ArrayList h=new ArrayList();
文档评论(0)