首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 媒体动画 > CAD教程 >

wpf里面的image控件多线程有关问题

2013-09-22 
wpf里面的image控件多线程问题工程需要读取一部分图片,然后显示在image控件上,但是每次读的时候,整个窗体

wpf里面的image控件多线程问题
工程需要读取一部分图片,然后显示在image控件上,但是每次读的时候,整个窗体都卡主了,我在读取过程实现了多线,但是在image.Source = imagepng的时候,还是卡


           Thread thrd = new Thread(new ThreadStart(() =>
            {    
           while (true)    
               {        
           this.Dispatcher.Invoke(new Action(() =>        
            {
            image= imagepng;//imagepng数据在后台读取,读取过程没有贴上来
            
                   }));   
                }}));
      thrd.Start(); 


不知道有什么方法能解决此问题
[解决办法]
System.ComponentModel.BackgroundWorker() backgroundWorker = new System.ComponentModel.BackgroundWorker();
            backgroundWorker.WorkerReportsProgress = true;
            backgroundWorker.WorkerSupportsCancellation = true;
            //回调方法
            backgroundWorker.RunWorkerCompleted += new System.ComponentModel.RunWorkerCompletedEventHandler(backgroundWorker_RunWorkerCompleted);
           //线程执行方法
 backgroundWorker.DoWork += new System.ComponentModel.DoWorkEventHandler(backgroundWorker_DoWork);
            backgroundWorker.RunWorkerAsync();
------解决方案--------------------


使用“保护线程”方式使用image的读写。
[解决办法]
      

//由于PictureBox1、Button_InsertSatelliteMapImage、ProgressBar1等均被涉及于线程,所以需要进行线程安全设置。
        delegate void PictureBoxRefreshDelegate(); // 线程刷新picturebox1
        private void PictureBoxRefresh()           // 线程刷新picturebox1
        {
            if (PictureBox1.InvokeRequired)
            {
                PictureBoxRefreshDelegate d = new PictureBoxRefreshDelegate(PictureBoxRefresh);
                this.Invoke(d);
            }
            else
            {
                PictureBox1.Refresh();
            }
        }

[解决办法]
Invoke这个会阻塞UI线程 其实你的多线程和单线程没有什么区别。。。。
你用一个控件.Invoke和
线程锁lock(控件){}是一样的

热点排行