我写的网络蜘蛛里面只有一个窗体,分别有两个类:窗体frmMain类以及Spider类(主要检索函数WebSnatch所在)。完成搜索的同时后,我打算在WebSnatch中改变窗体类控件(状态栏中的控件)的属性,以表明搜索完成。但是我想通过委托在WebSnatch中改变其属性,但是搜索完成后窗体无法立刻更新相应的属性。而我调用WebSnatch是用线程池的。
麻烦各位帮帮忙,究竟是什么原因造成,如可以请指出我代码实现的缺陷,谢谢...这是我写的网络蜘蛛代码(下载链接):
http://exs.mail.qq.com/cgi-bin/downloadfilepart/svrid7/NetSpider.rar?svrid=7&fid=a41e8b24d1242f1f935c34fdd0f2b7b2933084103048de07&&txf_fid=f183c15d4bcda1705697787e08811146356e70ae&&txf_sid=7054fd2
麻烦各位帮帮忙,究竟是什么原因造成,如可以请指出我代码实现的缺陷,谢谢...这是我写的网络蜘蛛代码(下载链接):
http://exs.mail.qq.com/cgi-bin/downloadfilepart/svrid7/NetSpider.rar?svrid=7&fid=a41e8b24d1242f1f935c34fdd0f2b7b2933084103048de07&&txf_fid=f183c15d4bcda1705697787e08811146356e70ae&&txf_sid=7054fd2
把主线程中的SynchronizationContext.Current传到WebSnatch的线程中,搜索完成后,用传进来的SynchronizationContext对象的Post方法,里面的委托封装主线程的函数,如frmMain.SetStatus(...)
不知道你的需要是不是这个。要保证状态栏的信息立即更新,需要你的主线程消息循环没有阻塞。
这些更新界面的操作不能放在Spider类里面,况且你这样用:
MethodInvoker mi = new MethodInvoker(m_frmMain .ReturnState);
m_frmMain = new frmMain();
m_frmMain.Select();
if (m_frmMain.IsDisposed == false )
{
m_frmMain.BeginInvoke(mi);
//m_frmMain.symble = true;
}
更新的不是主程序的frmMain对象,而是新开辟的。建议你把更新界面操作的代码改到主窗体内
更新界面的操作放在主窗体内,需要用订阅事件还是要自定义事件?我曾经尝试过调用“激活窗体”的订阅事件,可惜不能更新。还是用什么其他方法更新呢?请指教一下...