首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

, 跨线程窗口调用

2012-01-18 
救命啊, 跨线程窗口调用!原帖:http://community.csdn.net/Expert/topic/5641/5641924.xml?temp.9125788

救命啊, 跨线程窗口调用!
原帖:   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();
                        }                        
                }

怎么解决,   谢谢,谢谢,   再谢谢!!!!


[解决办法]
小伙子,耐心点,像这样的问题一般很少人会帮你解决,因为要花很长的时间.
主要还是你自己,要花很多精力,仔细的查找源码中的错误,一定能解决的
[解决办法]
up
[解决办法]
调试解决吧.在这里也看不出哪里有错误
[解决办法]
尝试修改为:

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();
}
}
[解决办法]
只要你找到任意一个在主线程中创建的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;
}

热点排行