您的位置:首页 > 产品设计 > UI/UE

关于异步更新UI界面多线程执行后台操作的一些思路整理

2014-02-21 13:21 453 查看
有些时候,某些操作会比较耗时间(如:连接一个没有开启的远程数据库),如果这个操作在UI线程上执行的话,就会在返回之前,让界面处于"假死"状态,影响用户体验.因此,从其他线程操作这类的"耗时"操作,是很有必要的,这里我主要整理当前,.net框架下,托管代码中线程安全的情况,因此,关闭掉线程安全检查来实现跨线程的界面更新操作不在讨论范畴.

我主要说说beginInvoke操作,这是一个异步的多线程调用.原理大家直接看msdn或者相关的大牛的科普分析就是了,我先说理论:

1.控件可以调用beginInvoke方法,并且可以传递参数列表(一个委托,参数数组),因此用你想更新的UI界面的控件来调用,是很理想的,用窗体本身,也行

2.由1知道,调用需要一个委托,因此,要声明一个委托类型,这个委托就是要异步执行的方法的委托实例的类型,这里有点儿拗口,知道这个委托时异步执行的就行UI更新

3.委托只是一个调用,因此需要一个单独的新线程来运行你的"耗时线程",这样就脱离了用户界面了.

4.开始这条新线程.

------------------------------下面是编码的步骤:里面的单词不是关键字,只是一个描述标示--------------------------------

1.声明一个委托类型,参数列表和你更新UI的方法参数列表相同 ,我用delegate表示

2.编写你的ui更新方法的代码代码,参数列表要和委托相同(会用来实例化我们的delegate),我用updateUI

3.写一个方法,这个方法会执行你的耗时操作和调用我们上面的delegate,也就是我们的新线程,参数列表最好为空,因为在开线程的时候,用来实例化threadState委托实例,我用thread表示.

4.注意:一定要在3中的方法里面实例化一个1中的deletegate,用控件调用beginInvoke,参数中的委托就用实例化的delegate

5.在你想执行这些操作的地方,开启新线程,调用3中的方法thread,并开始线程,就可以了

6.有什么不正确的地方,请大侠不要飘过,多多指教,有什么疑问的地方,请留言,共同讨论,另外需要demo参考的,也可以在评论里面联系我

7.谢谢各位看官,总结完毕.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: