public abstract class AbstractWeb
    {
       protected Hashtable _links;       public Hashtable Links
       {
           get { return _links; }
       }       #region Protect Helper Methods
       protected void GetPage()
       {
           _links = new Hashtable();
          // _links.Clear();
          // InitLinks();
           Thread t = new Thread(new ThreadStart(InitLinks));
           t.Start();
       }       protected string GetHtmlCode(string url)
       {
           return GetHtmlHelper.GetHtml(url);
       }
       #endregion       #region Abstract Methods
       protected abstract void InitLinks();
       #endregion
    }  /// <summary>
    /// 招職網
    /// </summary>
   public class JobSeeker:AbstractWeb
    {
       public JobSeeker()
       {
           GetPage();
       }       #region Protected Method
       /// <summary>
       ///初始化職業相關鏈接
       /// </summary>
       protected override void InitLinks()
       {
           string splitStart = "http://www.jiujik.com/jscommunity.php?communitycode=";
           string htmlCode = base.GetHtmlCode("http://www.jiujik.com/jshome_b5.html");
           int startIndex = htmlCode.IndexOf(splitStart);
           int length = htmlCode.IndexOf("更多......</a></td>") - startIndex;
           htmlCode = htmlCode.Substring(startIndex, length); //獲得職業類型的代碼
           string splitEnd = "</a></td>";
           while (htmlCode.IndexOf(splitStart) != -1)
           {
               startIndex = htmlCode.IndexOf(splitStart);
               length = htmlCode.IndexOf(splitEnd) - startIndex;
               string kindUrl = htmlCode.Substring(startIndex, length);
               htmlCode = htmlCode.Replace(kindUrl + splitEnd, "");
               string[] url = kindUrl.Split(new string[] { "\">" }, StringSplitOptions.None);
               _links.Add(url[1], url[0]); 這裏的_links有值
           }
       }
       #endregion
    }
            AbstractWeb k = new JobSeeker();
            foreach (DictionaryEntry entry in k.Links)這裏的k.Links為什麽拿不到值呢?
            {
                textBox1.Text += entry.Value + "\r\n";
            }
問題為紅色字

解决方案 »

  1.   

    存的那有值没?
    不太清楚
    方法一:   
    IDictionaryEnumerator   enumerator   =   thProduct.GetEnumerator();     
          while   (enumerator.MoveNext())   
          {   
            arrKey.Add( "@ "+enumerator.Key.ToString());                   //   Hashtable关健字   
            arrValue.Add(enumerator.Value.ToString());                         //   Hashtable值   
          }   方法二:   
    using   System.Collections;   
    HashTable   objHasTab;   
    //   Setting   values   to   objHasTab   
    foreach   (DictionaryEntry   objDE   in   objHasTab)   
    {   
            Console.WriteLine(objDE.Key.ToString());   
            Console.WriteLine(objDE.Value.ToString());   
    }   
      

  2.   

    可以取到值的呀我把 你的 改了一下 调试看看
      protected override void InitLinks() 
          { 
              string splitStart = "http://www.jiujik.com/jscommunity.php?communitycode="; 
          
                          string[] url = splitStart.Split('c'); 
                  _links.Add(url[1], url[0]); //這裏的_links有值 
             
          }
      

  3.   

       AbstractWeb k = new JobSeeker(); 
             
                //Hashtable objHasTab = (Hashtable)k.Links;
                //  Setting  values  to  objHasTab  
                foreach (DictionaryEntry objDE in k.Links)
                {
                    Console.WriteLine(objDE.Key.ToString());
                    Console.WriteLine(objDE.Value.ToString());
                } 就取到了, 看来 是 InitLinks() 你需要查查 
      

  4.   

    自已頂.我不用多線程的話,就不存在這個問題.用了多線程的話,在Inlinks方法裏邊,_links有值,但是在Foreach取這個對象的Links時,他的count為0,不值為什麽??這個之前跟我做的另一個項目一樣?我用一個線程創建一個窗體,再把窗體Show一下,但是結果也是一樣不行,根本就不顯示出來,你們試下這個,
    private void Button_click( object sender,event e)
    {
      thread t=new thread(show)
      t.start();
    }private void show()
    {
       form1 frm=new form1();   
       frm.show();           //這裏窗體根本就不顯示出來,這個是什麽問題呢??我覺得就跟我上邊的遇到的一樣.         
    }
      

  5.   

    看断点看看线程执行了没有,我只知道winform的话,如果在构造函数里开始一个线程,线程会等到form show完才执行线程
      

  6.   

    線程執行了,其實他有show出來,但是馬上又關了,如果我改成showdialog()就不會,不知什麽原因,誰能說下這個....
      

  7.   

    把开始线程代码写到form Shown事件里去
      

  8.   

    这是show()和showdialog()的异同:
    我们可以将show方法转化为showdialog方法,顾名思义,showdialog是一个进行路经绑定的show方法,他是不可以自由切换的,换言之,就是,当你没有关闭你当前页的前提下,你是无法关闭该页面后面的任一页面的,它是当前唯一(路经打开)为true的。 
    而show方法由于未进行绑定,它所显示的各个窗口、对话框是可以相互切换,而不需要关闭当前窗口、对话框。但是他由于未进行绑定,所以每个由show方法打开的窗口的顺序是非固定的,如果遇到什么问题,由show方法打开的窗口的顺序可能会有很大的改变! show()仅仅是显示出来窗口界面而已```也就是和你执行的结果在同一窗口显示```所显示的窗口可以在后台运行```而showDialog()是一个对话框窗口界面```执行结果以新窗口界面出现```不允许进行后台运行```就是你想编辑什么的时候```非得先关闭showDialog()窗口界面才可以进行其他操作``` 这就是它们的一点小区别了``` show()是非模式窗体. 
    showDialog()是模式窗体. 
    区别在于,以showDialog()打开的窗体,要等窗体关闭后才能操作其他窗体.而show()则不受此限制. 这是最经常的区别了, 
    还有一个我个人使用的心得,你可以了解 比如你先打开子窗体,想隐藏主窗体。 
    如果这个时候用Show的话,则会发生的事情是,打开子窗体的同时主窗体又显示出来,而使用ShowDialog()的时候主要当子窗体关闭的时候主窗体才会显示。 
    简单代码如下: 
    Form2 f2 = new Form2(); 
    this.Visible = false; 
    f2.ShowDialog(); 
    this.Visible= true; 
    这就是模态对话框的与Show的区别。
      

  9.   


    樓上何解,把開始線程寫到FormShown????
    麻煩你再幫我看下我的貼子,我主要是處理hashTable,為什麽拿不到值,就是因為開了線程,如果用單線程,就不會有這些問題了..
      

  10.   

    你是在线程中给_links赋值的,  可能是你在foreach时  线程方法还没有执行完成,或者说 线程方法刚刚开始执行,
    这时 _links中一个值也没有,然后你就foreach了
    试试在foreach之前对线程的状态进行判断,如果线程执行完了 在获取值