收录日期:2019/11/19 15:58:06 时间: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#又会多少新的好工具出现啊。

单位一XP笔记本电脑,近来无法正常关机,关机和重启都无反应,但在安全模式下正常,请问是不是病毒啊? 模仿 pplive.com 的模式 怎样描述一个WEB网站的需求? 用CryptoAPI生成密钥后把公钥用网络传给对方怎么做?谁帮忙解决后给一百分.绝不食言 怎么回事 子类化控件窗口出错的问题 怎么取最小的正数. 提取表单内容 trunk的封装备问题 从串口读入的数据byte()怎样转化成十进制啊 如何使用xml实现下拉列表框 ACCESS里面的option button问题!!! 这样的SQL语句怎么写?关于在两个SQL数据库服务器上查询 asp.net 怎么判断点击的是TreeView的哪个结点 c#中不运行如何编译程序? 请教公司内邮件服务器与外部转发邮件的问题. 比较郁闷的问题``我在多线程的环境调用某个com组件`` COM 对象与其基础 RCW 分开后就不能再使用?? 我到底要不要放弃,我到底该怎么办。。。。很苦恼,上班都没劲。。 多客户端连接,要求支持异步非阻塞方法,求框架 新手提问!!! 如何刷新托盘区域? VS2005 里继承窗口中的DataGridView为何有把小锁!!! 怎样更新这样的记录-_- i = i++的问题 想学驱动程序的开发,步骤是那些? pb中得高难问题,请高手帮忙 关于webservice的发布 myfaces中的 有关一个地址的问题