我写的网络蜘蛛里面只有一个窗体,分别有两个类:窗体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

解决方案 »

  1.   

    提取码是什么?
    把主线程中的SynchronizationContext.Current传到WebSnatch的线程中,搜索完成后,用传进来的SynchronizationContext对象的Post方法,里面的委托封装主线程的函数,如frmMain.SetStatus(...)
    不知道你的需要是不是这个。要保证状态栏的信息立即更新,需要你的主线程消息循环没有阻塞。
      

  2.   

    不好意思,忘了加提取码:7ce18d3f
      

  3.   

    MethodInvoker mi = new MethodInvoker(m_frmMain .ReturnState);
    这些更新界面的操作不能放在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对象,而是新开辟的。建议你把更新界面操作的代码改到主窗体内
      

  4.   

    happy happy 欢迎大伙来C# / .Net 7729746 交流社团 聊技术,项目合作。Blogs http://zhoufleru.cnblogs.com   
      

  5.   

    回hapen_zhang:
    更新界面的操作放在主窗体内,需要用订阅事件还是要自定义事件?我曾经尝试过调用“激活窗体”的订阅事件,可惜不能更新。还是用什么其他方法更新呢?请指教一下...
      

  6.   

    还有一点:更新窗体需要在执行完WebSnatch后才进行,那怎么保证能够在这个时候才更新?或者说搜索线程结束才更新呢?
      

  7.   

    蜘蛛...下载网页->分析文档获得信息->分类->入库在.net里面 不到10行代码就能做一个简单的蜘蛛...