当前位置:编程学习 > C#/ASP.NET >>

C# 跨线程问题,急求

public delegate void MyInvoke();
 private void button1_Click(object sender, EventArgs e)
        {     
            Thread t = new Thread(new ThreadStart(fun));
            t.IsBackground = true;
            t.Start();
        }
void fun()
        {
            if (pictureBox1.InvokeRequired)
            {
                MyInvoke _myInvoke = new MyInvoke(fun);
                this.pictureBox1.Invoke(_myInvoke);
            }
            else
            {
                dr = new draws(pictureBox1);
                for (int i = 0; i < 7; i++)
                {
                    dr.drawBaseNum(i);
                }
                pictureBox1.Image = dr.getBitmap();
            }
        }

我是自己定义了一个类 类当中对pictureBox1进行画图操作 正常时间要10来秒 所以会出现假死状态
后来我改用线程 但为什么一样会假死 望高手指点 --------------------编程问答-------------------- this.pictureBox1.Invoke(_myInvoke); 
换成
this.pictureBox1.BeginInvoke(_myInvoke);  --------------------编程问答-------------------- 正如一楼所述,将同步的换成异步的。 --------------------编程问答--------------------
引用 1 楼 jiacker 的回复:
this.pictureBox1.Invoke(_myInvoke);
换成
this.pictureBox1.BeginInvoke(_myInvoke);

结果也是一样···假死 --------------------编程问答-------------------- dr = new draws(pictureBox1); 
                for (int i = 0; i < 7; i++) 
                { 
                    dr.drawBaseNum(i); 
                } 
                pictureBox1.Image = dr.getBitmap(); 
在最后的时候才invoke前面计算的时候在线程中完成

this.pictureBox1.Invoke(_myInvoke2); 

void _myInvoke2(){
pictureBox1.Image = dr.getBitmap(); 
} --------------------编程问答--------------------
引用 4 楼 wodegege10 的回复:
dr = new draws(pictureBox1);
                for (int i = 0; i < 7; i++)
                {
                    dr.drawBaseNum(i);
                }
                pictureBox1.Image = dr.getBitmap();
在最后的时候才invoke前面计算的时候在线程中完成

this.pictureBox1.Invoke(_myInvoke2);

void _myInvoke2(){
pictureBox1.Image = dr.getBitmap();
}

能写得清晰点么?
我刚学 不太懂 不好意思 麻烦了 --------------------编程问答-------------------- 你这里犯了一个错误。

if (pictureBox1.InvokeRequired)
            {
                MyInvoke _myInvoke = new MyInvoke(fun);
                this.pictureBox1.Invoke(_myInvoke);
            } 

此处又在另外个线程里切回到主线程,你这里的多线程没有存在的任何意义。 --------------------编程问答--------------------
引用 5 楼 cccome 的回复:
引用 4 楼 wodegege10 的回复:dr = new draws(pictureBox1);                 for (int i = 0; i < 7; i++)                 {                     dr.drawBaseNum(i);                 }                 pictureBox1.Image = dr.getBitmap(); 在最后的时候才invoke前面计算的时候在线程中完成 this.pictureBox1.Invoke(_myInvoke2); void _myInvoke2(){ pictureBox1.Image = dr.getBitmap(); }
能写得清晰点么?
我刚学 不太懂 不好意思 麻烦了

把for循环中费时费资源的操作放在多线程或异步中, 最后显示的时候才调用UI操作, --------------------编程问答-------------------- 不是这里的问题吧。用picture画图出的问题。(大多数可能) --------------------编程问答--------------------

//这样试下
public delegate void MyInvoke(draws _draws); 
private void button1_Click(object sender, EventArgs e) 
        {    
            Thread t = new Thread(new ThreadStart(fun)); 
            t.IsBackground = true; 
            t.Start(); 
        } 
void fun() 
        { 
                dr = new draws(pictureBox1); 
                for (int i = 0; i < 7; i++) 
                { 
                    dr.drawBaseNum(i); 
                } 
            if (pictureBox1.InvokeRequired) 
            { 
                MyInvoke _myInvoke = new MyInvoke(fun); 
                this.pictureBox1.Invoke(_myInvoke,dr); 
            } 
            else 
            { 
                pictureBox1.Image = dr.getBitmap(); 
            } 
        } 

--------------------编程问答--------------------
引用 8 楼 zanfeng 的回复:
不是这里的问题吧。用picture画图出的问题。(大多数可能)

用 PICTUREBOX 画图 会出现什么问题?
大虾指点一下· --------------------编程问答-------------------- 我在 dr.drawBaseNum(i); 里 有对 pictruebox1 复杂的操作
会不会是这个问题  
要如何解决? --------------------编程问答-------------------- 加个Window.DoEvent(); --------------------编程问答-------------------- dr.drawBaseNum(i); 
把这个代码贴出来 --------------------编程问答-------------------- UserButton val = null;
                for (int i = 0; i < arraycontrol.Count; i++)
                {
                    conData = (ControlData)arraycontrol[i];                    
                    val = new UserButton(conData.x, conData.y, conData.EllipseHeigh, conData.EllipseWid, conData.text, conData.color);
                    val.Parent = this.pictureBox1;
                    val.Show();
                }

这是代码 我自定义了一个控件 我要将它们 全部 创建到 PICTUREBOX1 上 --------------------编程问答--------------------         public delegate void MyInvoke(Bitmap bit);
        private void button_Click(object sender, EventArgs e)
        {
            Thread t = new Thread(new ThreadStart(fun));
            t.IsBackground = true;
            t.Start();
        }

        Bitmap DrawBitmap()
        {
            dr = new draws(pictureBox1);
            for (int i = 0; i < 7; i++)
            {
                dr.drawBaseNum(i);
            }
            return dr.getBitmap();
        }

        void SetPictureImage(Bitmap bit)
        {
            pictureBox1.Image = bit;
        }

        void fun()
        {
            Bitmap bit = DrawBitmap();

            if (pictureBox1.InvokeRequired)
            {
                MyInvoke _myInvoke = SetPictureImage;
                this.pictureBox1.Invoke(_myInvoke, new object[] { bit });
            }
            else
            {
                SetPictureImage(bit);
            }
        } 


楼主这样试试 --------------------编程问答-------------------- 1. pictureBox1.InvokeRequired 换成 this.InvokeRequired;
2. this.pictureBox1.Invoke(_myInvoke,dr) 换成 this.invoke(_myinvoke,dr);
--------------------编程问答-------------------- 参考http://www.cnblogs.com/c2303191/articles/826571.html --------------------编程问答-------------------- 15 16 楼的都试过了
结果一样 假死 --------------------编程问答-------------------- 我换另外一种方式说一下
我在新的线程中用一个新的 PICTUREBOX 对象 进行对其处理
这部分 不会假死
但是我 一 SHOW() 这个PICTUREBOX 对象 的时候  就会出现假死状态
有什么好的方法解决? --------------------编程问答-------------------- 看17楼链接,已经说的够清楚了
补充:.NET技术 ,  C#
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,