救命啊, 跨线程窗口调用!

kfy0002 2007-07-07 11:28:02
原帖: http://community.csdn.net/Expert/topic/5641/5641924.xml?temp=.9125788;

错误出现在:
public void ShowChatRoom()
{
ChatRoom room = CreateChatRoom();

if (room.InvokeRequired)
{
EmptyMethod m = new EmptyMethod(room.Show);
//room.Invoke(m); 用此方法调用, 程序没有响应
m.Invoke(); // 用此方法调用, 出现跨线程调用控件错误


EmptyMethod m2 = new EmptyMethod(room.BringToFront);
////room.Invoke(m2);
room.Invoke(m2);
}
else
{
room.Show();
room.WindowState = System.Windows.Forms.FormWindowState.Normal;
room.BringToFront();
}
}

怎么解决, 谢谢,谢谢, 再谢谢!!!!
...全文
264 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2007-07-07
  • 打赏
  • 举报
回复
尝试修改为:

public void ShowChatRoom()
{
ChatRoom room = CreateChatRoom();

if (room.InvokeRequired)
{
EmptyMethod m = new EmptyMethod(room.Show);
//room.Invoke(m); 用此方法调用, 程序没有响应
this.Invoke(m); // 用此方法调用, 出现跨线程调用控件错误


EmptyMethod m2 = new EmptyMethod(room.BringToFront);
////room.Invoke(m2);
this.Invoke(m2);
}
else
{
room.Show();
room.WindowState = System.Windows.Forms.FormWindowState.Normal;
room.BringToFront();
}
}
兔子-顾问 2007-07-07
  • 打赏
  • 举报
回复
尝试修改为:

public void ShowChatRoom()
{
ChatRoom room = CreateChatRoom();

if (room.InvokeRequired)
{
EmptyMethod m = new EmptyMethod(room.Show);
//room.Invoke(m); 用此方法调用, 程序没有响应
this.Invoke(); // 用此方法调用, 出现跨线程调用控件错误


EmptyMethod m2 = new EmptyMethod(room.BringToFront);
////room.Invoke(m2);
this.Invoke(m2);
}
else
{
room.Show();
room.WindowState = System.Windows.Forms.FormWindowState.Normal;
room.BringToFront();
}
}
vainnetwork 2007-07-07
  • 打赏
  • 举报
回复
调试解决吧.在这里也看不出哪里有错误
calen 2007-07-07
  • 打赏
  • 举报
回复
up
curd0468 2007-07-07
  • 打赏
  • 举报
回复
小伙子,耐心点,像这样的问题一般很少人会帮你解决,因为要花很长的时间.
主要还是你自己,要花很多精力,仔细的查找源码中的错误,一定能解决的
RedGoldFish 2007-07-07
  • 打赏
  • 举报
回复
只要你找到任意一个在主线程中创建的Control就可以用它的Invoke(m);如果找不到,人为生成一个也行,把它设置成Public Static,无论在哪里都能访问到,但关键一定要在主线程上生成它的实例.

另外你这里边还有一个问题:

生成ChatRoom也需要在主线程上,也就是说 CreateChatRoom()也要在主线程上运行,这样改:

public void ShowChatRoom()
{

//myControl: 是一个主线程上生成的Control
/在这里实际上不用判断 if (room.InvokeRequired)
myControl.Invoke(new EmptyMethod(CreateChatRoom));

}


//把Show(); 和 BringToFront(); 也加到这里边去.
public ChatRoom CreateChatRoom()
{
if (chatRoom == null)
{
chatRoom = new ChatRoom(repeater.UserID, repeater.UserName, server);
chatRoom.Disposed += new EventHandler(chatRoom_Disposed);
chatRoom.Show();
chatRoom.BringToFront();
}
return chatRoom;
}

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧