如题,在面向对象中,问题被分解到各个对象中去处理,这样一来类中的方法调用就“好像”被延迟了。
例如有如下代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
public class Layer { Ilist<Field> myFields; public Ilist<Field> MyFields { get{ if(myFields == null){ myField = GetFields();} return myFields; } } private Ilist<Field> GetFields(){……}//代码省略 } public class Field { string FieldName; public string FieldName{get;set;} string FieldZh;//中文名称 pulic string FieldZH{get;set;} } //客户端 public void Main() { Ilist<Layer> myLayers = GetLayers();//GetLayers代码省略 foreach(var nextLayer in myLayers) { foreach(var nextField in nextLayer.MyFields)//此处才能调用Layer中的GetFields()方法 { console.writeline(nextField.FieldName); } } }
|
如上代码中对Layer中的GetFields()方法的调用问题,我们只能在客户端中才能调用对象中的方法,此时Layer中的GetFields()方法运算量很大的话,客户界面就会非常卡,如果在客户界面载入之前就将数据准备好的话,就可以解决这个问题。现在有一个疑问就是,对于对象中的方法,其调用时机如何控制?求各位大神解答,不胜感激!
说一点抛砖引玉吧
1、假设调用需要10秒或是更多。
2、这个事情是在打开一个FORM时进行。
如果是这样的话,你在客户界面FORM载入之前准备数据,好像也是不妥的,就会出现这样一个情况
我点下菜单或是一个按钮,希望出现一个界面FORM,结果等啊等,10秒后,出现了。
对于这样的情况,我的处理方式是
1、打开FORM,渲染。(通常1秒左右,看界面复杂度),显示界面。
2、使用BackgroundWorker加载数据,如果感觉时间会比较长,可以显示Busy Loading 界面。
3、数据加载完成,显示在GRID或是其他控件中。
谢谢答复,现在的情况就是一个窗体界面,我传入了一个Ilist<Layer>,然后将这个list绑定到combobox中,用户选中哪个layer,就在datagrid中读取layer的field数据,但是读取的数据很多,在用户界面上很卡,应该如何处理呢?
@chopic:
Data loading.... Please wait.
@爱编程的大叔: ……确实是好方法
首先“在面向对象中,问题被分解到各个对象中去处理,这样一来类中的方法调用就“好像”被延迟了”,这句话有些问题,前半句是对的,这个问题分解是为了程序架构更明晰,每个问题更简单。但是,类中的方法调用其实仍然是由业务来确定,所以,什么时候调用类的方法取决于你什么时候执行业务,而业务的触发则是用户在UI上的操作或是后台某些数据的变化。
因此,调用的时机并不是延迟了。
而你说的问题,其实是可以总结为业务需求:用户需要在打开界面时,看到myLayers中的数据。
那么数据准备自然是在用户看到界面之前,至于是在界面显示时准备数据还是用户打开之前就准备数据,只要最终完成了用户需要的业务,并且保证了用户体验即可。
“但是,类中的方法调用其实仍然是由业务来确定,所以,什么时候调用类的方法取决于你什么时候执行业务,而业务的触发则是用户在UI上的操作或是后台某些数据的变化。”这句话正是我想问的,在我需要调用这个业务的时候,需要执行的时间很长,造成用户界面很卡,这个问题应该如何解决呢?实际情况就是
我传入了一个Ilist<Layer>,然后将这个list绑定到combobox中,用户选中哪个layer,就在datagrid中读取layer的field数据,但是读取的数据很多,在用户界面上很卡,应该如何处理呢?
@chopic: 你说的多是指每个layer中的数据多么?
如果是每个layer中的数据少,而layer很多的话,就把layer中的数据读取延迟到用户点击layer时,或者如果是固定数据的话,则可以提前到layer构造的时候。如果layer中的数据多,可以在点击Layer时搞分页,