public class TestThread

        public ucTestScriptTree _tree=new ucTestScriptTree ();
        public void ForTest(ucTestScriptTree tn)
        {
            tn.BeginImport(tn.m_node, tn.list);
        }        private void OnShown(object sender, EventArgs e)
        {
            ////1
            //Thread m_Thread = new Thread(new ThreadStart(this.ThreadBeginImport));
            //m_Thread.Name = "UpImport_Thread";
            //m_Thread.Start();            ////2
            //Thread m_Thread = new Thread(new ParameterizedThreadStart(this.ForTest));
            //m_Thread.start(_tree);            ////3
            ThreadPool.QueueUserWorkItem(new WaitCallback(this.ForTest), _tree);        }
}分别企图用以上3中方法启动这个带参数的线程,但是都没能成功。直接编译错误请教各位,这个线程应该怎么才可以启动啊~?~先谢谢了~

解决方案 »

  1.   


    //將ForTest修改如下:
            public void ForTest(object state)
            {
                ucTestScriptTree tn = (ucTestScriptTree)state;
                tn.BeginImport(tn.m_node, tn.list);
            } 
    //使用下面的代碼即可啟動線程,亦即樓主所列之第二種方法
                Thread m_Thread = new Thread(new ParameterizedThreadStart(ForTest));
                m_Thread.Start(_tree);
      

  2.   

                Thread m_Thread = new Thread( new ParameterizedThreadStart( this.ForTest ) );
                m_Thread.Start( _tree );
      

  3.   

            public ucTestScriptTree _tree = new ucTestScriptTree();
            public void ForTest( object obj )
            {
                ucTestScriptTree tn = ( ucTestScriptTree )obj;
                tn.BeginImport( tn.m_node, tn.list );
            }
      

  4.   

    ucTestScriptTree这个是什么,一个UI控件吗?
      

  5.   

    boblaw :请问3楼的,我   public   void   ForTest(ucTestScriptTree   tn) 
                    { 
                            tn.BeginImport(tn.m_node,   tn.list); 
                    } 传进去的已经是一个类的实体了。。为什么就是编译不过呢!?
    为什么要通过强转呢!?帮忙再解释下。很快结贴 !
      

  6.   

        public class TestThread
        {
            public ucTestScriptTree _tree = new ucTestScriptTree();
            public void ForTest( object obj )
            {
                ucTestScriptTree tn = ( ucTestScriptTree )obj;
                tn.BeginImport( tn.m_node, tn.list );
            }        private void OnShown( object sender, EventArgs e )
            {
                ////1
                //Thread m_Thread = new Thread( new ThreadStart( this._tree.BeginImport ) );
                //m_Thread.Name = "UpImport_Thread";
                //m_Thread.Start();            //2
                Thread m_Thread = new Thread( new ParameterizedThreadStart( this.ForTest ) );
                m_Thread.Start( _tree );            ////3
                ThreadPool.QueueUserWorkItem( new WaitCallback( this.ForTest ), _tree );        }
        }
      

  7.   

    看看有关delegate方面的知识就知道了吧
      

  8.   

    以前写的一个带参数的多线程例子,供你参考using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading;namespace StringReverse
    {
        class Program
        {
            //public delegate void ThreadStart();
            static void Main(string[] args)
            {
                Reverse rs = new Reverse();
                rs.str1 = "abcd";
                rs.str2 = "efg";
                Console.Write("转换前的字符串{0}",rs.str1+rs.str2);
                Thread t = new Thread(new ThreadStart(rs.ReverseMethod));
                
                t.Start();
               
                Console.Read();
            }
        }    class Reverse
        {
            public string str1;
            public string str2;
            public void ReverseMethod()
            {
                List<string> strArray1 = new List<string>();
                List<string> charArray2 = new List<string>();
                for (int i = str1.Length-1; i >= 0; i--)
                {
                    strArray1.Add(str1[i].ToString());
                }
                for (int j = str2.Length-1; j >= 0; j--)
                {
                    charArray2.Add(str2[j].ToString());
                }
                StringBuilder temp = new StringBuilder();
                foreach (string str in charArray2)
                {
                    temp.Append(str);
                }            foreach (string s in strArray1)
                {
                    temp.Append(s);
                }
                
                //returnStr = temp.ToString();
                Console.WriteLine("\n更换位置后的字符串{0}", temp.ToString());
                
            }
        }}
      

  9.   

    基本上是第二种方式
    public void OnShown(ucTestScriptTree aTree)
    {
        Thread trd = new Thread(new ParameterizedThreadStart(this.Test));
        trd.Start(aTree);
    }private void Test(Object aObj)
    {
        ucTestScriptTree tree = aObj as ucTestScriptTree;
        if (tree == null)
            return;    tree.BeginImport(tree.m_node, tree.list); 
    }
      

  10.   

    boblaw   : 请问3楼的,我       public       void       ForTest(ucTestScriptTree       tn)   
                                    {   
                                                    tn.BeginImport(tn.m_node,       tn.list);   
                                    }   传进去的已经是一个类的实体了。。为什么就是编译不过呢!? 
    为什么要通过强转呢!? 帮忙再解释下。 很快结贴   !
    ----------------------------------
    ParameterizedThreadStart是一個委托,而在此程序中ForTest是該委托的實現,ParameterizedThreadStart委托聲明的是傳入一個Object參數,因此ForTest也必須是一個Object參數
      

  11.   


    //这是ParameterizedThreadStart的定义
    public delegate void ParameterizedThreadStart (Object obj}//它是个delegate
    //也就 是说
    Thread m_Thread = new Thread(new ParameterizedThreadStart(这里用的函授数必须是和ParameterizedThreadStart定义是一样的));//所以ForTest要定义成这样
    public   void   ForTest(   object   obj   ) //这样一来ForTest里面自然要对obj强制转换了