wpf 异步问题
wpf 我现在用的异步方法是backgroundworker 但是主界面还是会卡 大家有什么好办法? --------------------编程问答-------------------- 你太多的操作放在UI线程上了,既然用到了异步,耗时操作要全部放到异步线程里,UI线程只能处理界面更新的逻辑。另外别用backgroundworker,那东西功能太弱了,要在一个复杂的操作中,分离出多个片段到UI线程上操作,就没办法做到,如果你把整个操作都放到UI线程上执行,肯定会卡的,必须做片段分离,单独把涉及到UI操作的部分进行回调处理。 --------------------编程问答--------------------有没有具体怎么操作,不太懂....请指教 --------------------编程问答-------------------- 你不是也没给具体代码吗 --------------------编程问答--------------------
您说的:
必须做片段分离,单独把涉及到UI操作的部分进行回调处理。
是什么意思? --------------------编程问答-------------------- 整体代码在异步线程里执行,里面的一行或几行代码直接操作界面元素的代码封装到函数里面,通过this.BeginInvoke回调执行,而这样的代码块可能很多,例如循环里面出现的可能。
如果你不会自己开启异步线程,先去学习下如何开启多线程,不能使用backgroundworker --------------------编程问答--------------------
非常感谢。 --------------------编程问答-------------------- 如果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段处理,第一段是异步执行,第二段是执行后的同步界面处理,你这里显然不够,必须自己开线程,有多少个界面处理,就插入多少个回调方法来处理,整体回调还是会卡界面。 --------------------编程问答--------------------
如果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#