首页 新闻 会员 周边

c# winform高手进呀。。

0
悬赏园豆:10 [已解决问题] 解决于 2013-02-28 23:35

加载数据?...........200000000000000000

KeVinDurant的主页 KeVinDurant | 初学一级 | 园豆:5
提问于:2013-02-28 10:50
< >
分享
最佳答案
0

你的多线程没有起到作用,耗时的操作仍Sleep函数然是在UI线程中执行的,因此会导致UI冻结。(通过Debug看看执行Sleep函数时的调用栈就知道了)

把Do函数改成如下形式,让耗时操作在你新启动的线程中执行,UI线程中只负责更改界面(即执行和control相关的操作)。

        private void Do()
        {
            Thread.Sleep(5000);
            List<string> list = new List<string>() { "c#" };
            this.Invoke(new Action(() =>
            {
                this.dataGridView1.DataSource = list;
            }));
        }
收获园豆:5
天方 | 大侠五级 |园豆:5407 | 2013-02-28 21:13

我这里用sleep函数只是为了模拟长时间操作........

KeVinDurant | 园豆:5 (初学一级) | 2013-02-28 22:49

this.Invoke(new Action(() =>
            {
                Thread.Sleep(5000);
                List<string> list = new List<string>() { "c#" };
                this.dataGridView1.DataSource = list;
            }));

难道这段代码不是在新启动的线程中执行的吗??

那句通过Debug看看执行Sleep函数时的调用栈就知道了。。。怎么看。可否切个图说明下。分全给了。

KeVinDurant | 园豆:5 (初学一级) | 2013-02-28 22:56
其他回答(2)
0

this.Invoke(new Action(() =>
            {
                Application.DoEvents();//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                Thread.Sleep(5000);
                List<string> list = new List<string>() { "c#" };
                this.dataGridView1.DataSource = list;
            }));

收获园豆:5
Firen | 园豆:5385 (大侠五级) | 2013-02-28 12:25

添加一行代码。

支持(0) 反对(0) Firen | 园豆:5385 (大侠五级) | 2013-02-28 12:27

我不是使用了多线程吗。。相当于异步了。。为什么还会出现这种情况呢??请指教

支持(0) 反对(0) KeVinDurant | 园豆:5 (初学一级) | 2013-02-28 16:34
0

没有看出来哪里使用了多线程,this.Invoke都是在界面线程中运行的。

南桥一梦 | 园豆:147 (初学一级) | 2013-02-28 17:11

这还不是多线程呀?

 tr = new Thread(new ThreadStart(Do)); !!!!!!!!不懂就别回答

支持(1) 反对(0) KeVinDurant | 园豆:5 (初学一级) | 2013-02-28 17:15

this.Invoke都是在界面线程中运行的。这句话怎么解释??

支持(0) 反对(0) KeVinDurant | 园豆:5 (初学一级) | 2013-02-28 22:58
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册