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); --------------------编程问答-------------------- 正如一楼所述,将同步的换成异步的。 --------------------编程问答--------------------
结果也是一样···假死 --------------------编程问答-------------------- 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);
}
此处又在另外个线程里切回到主线程,你这里的多线程没有存在的任何意义。 --------------------编程问答--------------------
把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();
}
}
用 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#