首页 新闻 会员 周边 捐助

aAsp.net白屏小问题(有哪些常见的解决方案)?

1
悬赏园豆:100 [已解决问题] 解决于 2011-01-10 21:48

问题模型大概是这样的:

有两个任务,第一个要耗大量的时间(5秒左右),第二个任务只是绑定数据(不怎么耗时间),当前状况是,两个任务在一个线程里面,导致白屏了5秒左右,我想将第一个任务用另一个线程工作,控制界面的button的enable属性,一开始false,任务完成后变成true,不知道要注意些什么,

试了好多方法,效果都不怎么好,都有缺点,比较赞同的是使用多线程.

哪位有时间的帮忙看看,先谢过!

问题补充: 我试了,可以新开线程执行任务,但是不稳定,怎么说呢?执行n次有m次不同的结果?不知道什么原因?还有种情况,就是我新开的那个线程里面使用了页面的属性(最主要的操作就是组装页面的一个属性)但是当线程走完了,那个集合也没有值了,锁过了,也锁不住 刚刚试了下backgroundworker,还是有那个白屏的问题, 因为我执行任务是在页面加载的时候执行的(改成了LoadComplete也会白屏),难道还是会阻塞主线程?应该不会吧. 多线程啊异步啊确实很重要,单很少搞过,winform里面搞过,但asp.net 里面用起来,感觉不大对 分不够 可以再加啊 有谁遇到过没,帮帮忙哈,这个问题如果解决了,以后那些大数据量啊,耗时的就比较容易了,只要是在后台运行,用户感觉不到,就是界面也不要进度条什么的,但是界面仍然可以操作,白屏问题经常遇到, 分我全给了哈,才200分 不成敬意 呵呵 总共才200分,不能全给的,郁闷... 起始在线程里面使用异步的话,不会白屏,就是那个集合在workcomplete的时候还有值的,单一走完就没了?是不是没锁住的问题啊?又回到原始位置了,估计应该是没锁住的问题? 该怎么锁住呢, 大哥大姐们 赐教下... 自问自答先, 是不是子线程里面不能改变 父线程那个属性啊?改了也没用?我传个参数进去看看.. 先放放吧...有谁有好办法的,发我邮箱哈谢谢,Bluce.Cao@hotmail.com
Bluce.Cao的主页 Bluce.Cao | 初学一级 | 园豆:80
提问于:2010-12-30 09:26
< >
分享
最佳答案
0

ajax,做任务时友好提示OK?

收获园豆:50
LoujaDy | 小虾三级 |园豆:908 | 2010-12-30 12:37
不能让用户知道,他也没必要知道,因为这个过程中他要操作页面,填写表单,不能让他等
Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 12:40
@Chao-f:可以不提示,不会影响用户操作页面
LoujaDy | 园豆:908 (小虾三级) | 2010-12-30 12:46
额,怎么实现,请指点下
Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 12:53
你的意思是说,用纯的Ajax,然后转到本身页面处理?
Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 12:55
如果是本身页面的话,也会阻塞的,也就是说会卡住
Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 12:57
@Chao-f: A页面为用户操作页面,加载完成后Ajax发两个请求到服端的Handler去做你的任务,用户一直是可以操作A页面的呀,不会有影响
LoujaDy | 园豆:908 (小虾三级) | 2010-12-31 13:02
其他回答(2)
0

给你贴上个例子的代码吧,你自己看看,呵呵,使用backgroundWorker控件来创建新线程

  private void button1_Click(object sender, EventArgs e)
        {
            this.button1.Enabled = false;
            this.textBox3.Text = string.Empty;
            this.button2.Enabled = true;
            this.progressBar1.Value = 0;
            backgroundWorker1.RunWorkerAsync(new CalcInput(int.Parse(this.textBox1.Text), int.Parse(this.textBox2.Text)));
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            CalcInput input = (CalcInput)e.Argument;
            //System.Threading.Thread.Sleep(5000);
            //e.Result = input.x + input.y;
            for (int i = 0; i < 10; i++)
            {
                System.Threading.Thread.Sleep(500);
                backgroundWorker1.ReportProgress(i * 10);
                if (backgroundWorker1.CancellationPending)
                {
                    e.Cancel = true;
                    return;
                }
            }
            e.Result = input.x + input.y;
        }

        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
            this.progressBar1.Value = e.ProgressPercentage;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            //this.textBox3.Text = e.Result.ToString();
            //this.button2.Enabled = true;
            //this.button1.Enabled = false;
            //this.progressBar1.Value = 100;
            if (e.Cancelled)
            {
                this.textBox3.Text = "cancelled";

            }
            else
            {
                this.textBox3.Text = e.Result.ToString();
            }
            this.button2.Enabled = true;
            this.button1.Enabled = false;
            this.progressBar1.Value = 100;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            backgroundWorker1.CancelAsync();
        }
    }
    public struct CalcInput
    {
        public CalcInput(int x, int Y)
        {
            this.x = x;
            this.y = Y;
        }
        public int x;
        public int y;
    }

如果没看懂,呵呵,可以来问我,呵呵

收获园豆:50
orchids | 园豆:260 (菜鸟二级) | 2010-12-30 09:35
谢谢啊,昨天我也用了这个backgroundwork组件,好像这个只是异步,不过我再试试,等等哈
支持(0) 反对(0) Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 09:37
xiaodsn 还是不行,上面的代码有个问题,过了5秒,那个按钮的enable没变回来
支持(0) 反对(0) Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 09:50
你那边测试可以不,我这边不行
支持(0) 反对(0) Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 09:51
额,你上面代码有个地方写错了,可以变了,我在看下其他的问题哈
支持(0) 反对(0) Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 09:55
兄台,那个委托的BeginInvoke 可以不?
支持(0) 反对(0) Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 09:58
因为在页面加载的时候执行任务的,还是白屏5秒
支持(0) 反对(0) Bluce.Cao | 园豆:80 (初学一级) | 2010-12-30 10:22
@Chao-f:有谁会在asp.net中使用backgroundwork组件?????????
支持(0) 反对(0) LoujaDy | 园豆:908 (小虾三级) | 2010-12-31 13:05
我给你的例子还不够清楚么?
支持(0) 反对(0) orchids | 园豆:260 (菜鸟二级) | 2011-01-05 15:57
0

看了问题.有点建议

"有两个任务,第一个要耗大量的时间(5秒左右),第二个任务只是绑定数据(不怎么耗时间),当前状况是,两个任务在一个线程里面,导致白屏了5秒左右,我想将第一个任务用另一个线程工作,控制界面的button的enable属性,一开始false,任务完成后变成true"

既然是任务完成才变为true.明显是一个单线的任务模式!为了解决白屏5秒问题开多线程- -!感觉方向不对

本人建议应该优化那个耗时5秒的任务,且控件改为双缓冲模式

daone | 园豆:273 (菜鸟二级) | 2011-04-08 17:11
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册