收录日期:2020/06/01 03:49:09 时间:2016/07/16 21:40:01 标签:C#
我有一个方法,是带有参数的,我想用多线程,但是多线程只能用方法名字,不能用参数,哪位老大能告诉我怎么使多线程可以带参数啊?
把方法封装在类里。
通过类的实例化传入参数。

定义线程时用类名.方法名

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

最普通的一种(但是不同于那个只有一个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();


多运行几遍试试看,你会看到打印两个用户名的代码执行次序是随机的。
sorry! private void Show() 中的private应该写为public,请修改过来再测试!

另外,实际上我觉得这种方法还是很麻烦,我直接在线程处写匿名方法,例如:

            var y=2;
            new Thread(() =>
            {
                Console.WriteLine("张三");
                var x = 1;
                Console.WriteLine(x + y);  //这里直接引用外边的变量
            }).Start();


这样更爽。
呵呵,刚刚直接回帖,没有仔细看上面的回复。其实已经有人说出第一种方法了。那是很古老的方法。

实际上传递参数还能举出1、2种有效而清晰的方法。

不过我现在基本上只用匿名方法这一种写法。匿名方法很方便,省得一本正经地去定义class了。不知道随着.net升级到4.0,c#又会多少新的好工具出现啊。

日历控件里怎么把不属于当月的那些日期隐藏掉?? 我的开ie时要我装office,按几次取消才能进入ie,请问如何解决? 这几天怎么HOTMAIL的邮箱老是打不开啊 小弟想学java,给提提建议 面向从Delphi转向NET的朋友们 请问如何用C#把数据写如EXCEL文件,以及如何创建EXCEL文件。跪求! (急急急急急急急 解决高分相送)请问在c#的b/s(webform)中,怎样将DataTable中的数据保存为一个在客户端自动创建的Excel文件中?? 请教这C语句什么意思 团队开发asp.net web项目,大虾给点意见 sqlserver数据库中,一个datetime类型的字段,我如何找出2003-02-02的数据? 框架显示的问题 跪求!急..... 我的开ie时要我装office,按几次取消才能进入ie,请问如何解决? 用SQL SERVER 2K的看过来 TYPE TESTTAB IS TABLE OF TABLENAME.ID%TYPE,怎么改写到sql server下面,请高手指点 高分求如何在jbuilder9 下配置weblogic7 如何在一个对话框弹出新运行某一个函数? 如何判断一个窗口是否取得了焦点?(急,help) 关于取回WINXP密码的问题 有关论坛中新帖提示的问题。 高分求救 怎么操作远程数据库? 救助,表单的大小怎么解决? For helps 请大家来帮忙 Excel中如何获得被选中Cell中的文字? 新手首次发问:有谁研究过多重继承下如何实现序列化的功能? 百份求GDI+帮助文件:GDICPP.CHM和GDICPP.CHI,谢谢!!! 2000 ADVANCE SERVER 管理员帐号丢了(没别的帐户),不格式化硬盘,有无解决方法?急!!! swing 问题,高手解答,(在线等)