首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

winform UI更新时卡的有关问题

2012-06-16 
winform UI更新时卡的问题RT这个问题已经困扰我很久了,查了很多资料,还是没解决。。。是这样的,我做一个知识

winform UI更新时卡的问题
RT
这个问题已经困扰我很久了,查了很多资料,还是没解决。。。
是这样的,我做一个知识库管理编辑器,用的是RichTextBox,导入文件用的是LoadFile方法。
当LoadFile加载大数据(比如:100M)时,为了友好响应,所以会弹出WaitForm,可是WaitForm却不能响应,代码如下:

C# code
/// <summary>        private delegate void LoadFileDelegate(string path, RichTextBoxStreamType streamType);        /// 加载文件        /// </summary>        /// <param name="path"></param>        public bool LoadFile(string path)        {            WaitForm waitForm = null;            bool isSuc = true;            RichTextBoxStreamType streamType = RichTextBoxStreamType.RichText;            try            {                Thread thread = new Thread(new ThreadStart(delegate()                {                    System.Threading.Thread.Sleep(200);                    LoadFileDelegate loadFileDelegate = new LoadFileDelegate(LoadFile);                    loadFileDelegate.BeginInvoke(path, streamType,                    result =>                    {                        LoadFileDelegate loadFileDelegate2 = (LoadFileDelegate)result.AsyncState;                        loadFileDelegate2.EndInvoke(result);                        if (waitForm != null)                        {                            waitForm.Invoke(new MethodInvoker(delegate()                            {                                waitForm.Close();                                waitForm.Dispose();                            }));                        }                    }, loadFileDelegate);                }));                thread.Start();                waitForm = new WaitForm("正在导入文件,请稍侯...");                waitForm.ShowDialog();                //txtEditor.LoadFile(path, streamType);            }            catch (Exception ex)            {                LogFile.WriteLogInfo(ex.ToString(), "编辑器【加载文件】失败!");                isSuc = false;            }            return isSuc;        }        private void LoadFile(string path, RichTextBoxStreamType streamType)        {            this.BeginInvoke(new MethodInvoker(delegate()            {                txtEditor.LoadFile(path, streamType);            }));        }


[解决办法]
System.Threading.Thread.Sleep(200) 这是做什么呢?好奢侈地浪费200毫秒啊!

既然使用异步调用 loadFileDelegate,你在外边又套用一个线程干什么呢?难道额外管理一个线程不占用时间?

你的waitForm.ShowDialog();工作在主线程,自然就把主线程卡死了。
[解决办法]
如果“为了友好响应”,可以看看msdn上关于 backgroundworker 之类的代码。
[解决办法]
1,把外头的蛇足线程去掉
2,第二个方法改成这样:

C# code
        private void LoadFile(string path, RichTextBoxStreamType streamType)        {            txtEditor.LoadFile(path, streamType);        }
[解决办法]
为什么要用多线程那么麻烦呢。。为什么要一次load 100m呢。。分页load,每次几十100k,秒杀多线程。。连wait都省了。。
[解决办法]
我覺得你應該使用 AutoVue 20.2,這個能讀幾百種文檔,況且是java的api,速度很快,不假死
[解决办法]
探讨

引用:
我覺得你應該使用 AutoVue 20.2,這個能讀幾百種文檔,況且是java的api,速度很快,不假死


能提供个免费的吗

热点排行