当前位置:编程学习 > C#/ASP.NET >>

wpf 异步问题

wpf 我现在用的异步方法是backgroundworker 但是主界面还是会卡 大家有什么好办法? --------------------编程问答-------------------- 你太多的操作放在UI线程上了,既然用到了异步,耗时操作要全部放到异步线程里,UI线程只能处理界面更新的逻辑。另外别用backgroundworker,那东西功能太弱了,要在一个复杂的操作中,分离出多个片段到UI线程上操作,就没办法做到,如果你把整个操作都放到UI线程上执行,肯定会卡的,必须做片段分离,单独把涉及到UI操作的部分进行回调处理。 --------------------编程问答--------------------
引用 1 楼 qldsrx 的回复:
你太多的操作放在UI线程上了,既然用到了异步,耗时操作要全部放到异步线程里,UI线程只能处理界面更新的逻辑。另外别用backgroundworker,那东西功能太弱了,要在一个复杂的操作中,分离出多个片段到UI线程上操作,就没办法做到,如果你把整个操作都放到UI线程上执行,肯定会卡的,必须做片段分离,单独把涉及到UI操作的部分进行回调处理。

有没有具体怎么操作,不太懂....请指教 --------------------编程问答-------------------- 你不是也没给具体代码吗 --------------------编程问答--------------------
引用 3 楼 qldsrx 的回复:
你不是也没给具体代码吗

您说的:
必须做片段分离,单独把涉及到UI操作的部分进行回调处理。
是什么意思? --------------------编程问答-------------------- 整体代码在异步线程里执行,里面的一行或几行代码直接操作界面元素的代码封装到函数里面,通过this.BeginInvoke回调执行,而这样的代码块可能很多,例如循环里面出现的可能。
如果你不会自己开启异步线程,先去学习下如何开启多线程,不能使用backgroundworker --------------------编程问答--------------------
引用 5 楼 qldsrx 的回复:
整体代码在异步线程里执行,里面的一行或几行代码直接操作界面元素的代码封装到函数里面,通过this.BeginInvoke回调执行,而这样的代码块可能很多,例如循环里面出现的可能。
如果你不会自己开启异步线程,先去学习下如何开启多线程,不能使用backgroundworker

非常感谢。 --------------------编程问答-------------------- 如果UI线程执行耗时的操作一样是会卡的,你要让耗时的操作放在后台线程进行操作,UI线程只线程后台线程的进度,不知道你UI线程的源码是怎样的,最好贴出源码才能更好分析 --------------------编程问答--------------------
引用 7 楼 lizhi3186575 的回复:
如果UI线程执行耗时的操作一样是会卡的,你要让耗时的操作放在后台线程进行操作,UI线程只线程后台线程的进度,不知道你UI线程的源码是怎样的,最好贴出源码才能更好分析

 using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += new DoWorkEventHandler(delegate(object sender, DoWorkEventArgs e)
                {
                    LoadModule();
                });
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
                worker.RunWorkerAsync();
            } --------------------编程问答--------------------
引用 8 楼 yhdkzy 的回复:
Quote: 引用 7 楼 lizhi3186575 的回复:

如果UI线程执行耗时的操作一样是会卡的,你要让耗时的操作放在后台线程进行操作,UI线程只线程后台线程的进度,不知道你UI线程的源码是怎样的,最好贴出源码才能更好分析

 using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += new DoWorkEventHandler(delegate(object sender, DoWorkEventArgs e)
                {
                    LoadModule();
                });
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
                worker.RunWorkerAsync();
            }

没用的,不贴代码我就知道问题了,那个worker_RunWorkerCompleted函数里面执行的时间较长,它执行需要2秒的话,界面就要卡2秒,需要10秒的话,界面就要卡10秒,难道你再在那个函数里面调用BackgroundWorker ?这显然不现实,BackgroundWorker 只能2段处理,第一段是异步执行,第二段是执行后的同步界面处理,你这里显然不够,必须自己开线程,有多少个界面处理,就插入多少个回调方法来处理,整体回调还是会卡界面。 --------------------编程问答--------------------
引用 9 楼 qldsrx 的回复:
Quote: 引用 8 楼 yhdkzy 的回复:

Quote: 引用 7 楼 lizhi3186575 的回复:

如果UI线程执行耗时的操作一样是会卡的,你要让耗时的操作放在后台线程进行操作,UI线程只线程后台线程的进度,不知道你UI线程的源码是怎样的,最好贴出源码才能更好分析

 using (BackgroundWorker worker = new BackgroundWorker())
            {
                worker.DoWork += new DoWorkEventHandler(delegate(object sender, DoWorkEventArgs e)
                {
                    LoadModule();
                });
                worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
                worker.RunWorkerAsync();
            }

没用的,不贴代码我就知道问题了,那个worker_RunWorkerCompleted函数里面执行的时间较长,它执行需要2秒的话,界面就要卡2秒,需要10秒的话,界面就要卡10秒,难道你再在那个函数里面调用BackgroundWorker ?这显然不现实,BackgroundWorker 只能2段处理,第一段是异步执行,第二段是执行后的同步界面处理,你这里显然不够,必须自己开线程,有多少个界面处理,就插入多少个回调方法来处理,整体回调还是会卡界面。

worker_RunWorkerCompleted我在这里面没有执行任何代码;您说的自己开线程,backgroundwoker不就是一个线程吗?我是有好几个backgroundworker的,我这些都是在viewmodel中处理的,所以回调的我只能用application的,这是不是也是整体回调的?如果可以的话,加我q1379376261 --------------------编程问答-------------------- 如果说worker_RunWorkerCompleted里面没有代码,那问题就是LoadModule方法了,不少新手会犯一个错误,因为有涉及到UI操作,就将整个代码用this.Invoke回调操作,那样就失去了异步操作的意义了。也许10行代码中只有一行是UI有个的操作,结果把10行都回调操作了。 --------------------编程问答-------------------- 另外你既然没有用到RunWorkerCompleted事件,那为啥不这样写:
new Action(LoadModule).BeginInvoke(null,null);

如此简洁的代码就把一个方法放入异步线程里执行了。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,