我有一个方法,是带有参数的,我想用多线程,但是多线程只能用方法名字,不能用参数,哪位老大能告诉我怎么使多线程可以带参数啊?

解决方案 »

  1.   


    class Program
        {
            static void Main(string[] args)
            {
                ParameterizedThreadStart pts = new ParameterizedThreadStart(Show);
                Thread t = new Thread(pts);
                t.Start("Hello!How are you!");
                
            }        private static void Show(object a)
            {
                while (true)
                {
                    Console.WriteLine(a);
                }
            }
        }创建一个线程的时候需要给一个委托或者方法名,其中有一个是可以带参数的委托。
    这样创建之后在启动的时候需要传递一个object的参数,具体使用如上面的代码。
    可能你要问那我要想传两个参数怎么办呢?很容易,因为传的object类型,那么我们可以定义一个类,这个类里面定义我们要传的参数就可以了,这也体现了C#和Java的一大优势,就是封装。
      

  2.   

    办法很多,其实线程也能传递参数的!但是只能传一个object,所以你可以把你的参数封装到一个结构里面然后传递过去,线程方法再把它转回到结构类型
    或者通过构造函数先传递好参数,然后在启动线程方法
      

  3.   

    办法确实很多很多。最普通的一种(但是不同于那个只有一个object参数的方法),你可以把方法包装一下成为一个对象,这样就可以为方法自定义许多自己觉得清晰的强类型属性。例如我拿#2楼的Show代码做例子,假设我们需要为Show方法传递三个参数:用户名、用户地址、用户存款,我们就可以写:public class ShowThread
    {
      public string 用户名{get;set;}
      public string 用户地址{get;set;}
      public decimal 用户存款{get;set;}  private void Show()
      {
         Console.WriteLine(this.用户名);
      }
    }
    而调用方就可以写:var p1 = new ShowThread { 用户名 = "s1", 用户存款 = 100 };
    new Thread(p1.Show).Start();
    var p2 = new ShowThread { 用户名 = "张三", 用户存款 = 800 };
    new Thread(p2.Show).Start();
    Console.ReadKey();多运行几遍试试看,你会看到打印两个用户名的代码执行次序是随机的。
      

  4.   

    sorry! private void Show() 中的private应该写为public,请修改过来再测试!另外,实际上我觉得这种方法还是很麻烦,我直接在线程处写匿名方法,例如:            var y=2;
                new Thread(() =>
                {
                    Console.WriteLine("张三");
                    var x = 1;
                    Console.WriteLine(x + y);  //这里直接引用外边的变量
                }).Start();这样更爽。
      

  5.   

    呵呵,刚刚直接回帖,没有仔细看上面的回复。其实已经有人说出第一种方法了。那是很古老的方法。实际上传递参数还能举出1、2种有效而清晰的方法。不过我现在基本上只用匿名方法这一种写法。匿名方法很方便,省得一本正经地去定义class了。不知道随着.net升级到4.0,c#又会多少新的好工具出现啊。