1.方式一:使用ParameterizedThreadStart委托

如果使用了ParameterizedThreadStart委托,线程的入口必须有一个object类型的参数,且返回类型为void.

using System;
using System.Threading; namespace ThreadWithParameters
{
class Program
{
static void Main(string[] args)
{
string hello = "hello world"; //这里也可简写成Thread thread = new Thread(ThreadMainWithParameters);
//但是为了让大家知道这里用的是ParameterizedThreadStart委托,就没有简写了
Thread thread = new Thread(new ParameterizedThreadStart(ThreadMainWithParameters));
thread.Start(hello); Console.Read();
} static void ThreadMainWithParameters(object obj)
{
string str = obj as string;
if(!string.IsNullOrEmpty(str))
Console.WriteLine("Running in a thread,received: {0}", str);
}
}
}

以上代码只能传递一个参数,如果有时我们向线程传递给多的参数,那种方式使用将有局限性(如果用类作为对象传递参数,那么需要要另外建立一个类,也稍有点麻烦) 
如果用这种方法我们密切要注意的就是ThreadMainWithParameters方法里的参数必须是object类型的,我们需要进行类型转换。此方法不作推荐。

2.方式二: 创建自定义类

定义一个类,在其中定义需要的字段,将线程的主方法定义为类的一个实例方法,请看实际的例子。

using System;
using System.Threading; namespace ThreadWithParameters
{
public class MyThread
{
private string data; public MyThread(string data)
{
this.data = data;
} public void ThreadMain()
{
Console.WriteLine("Running in a thread,data: {0}", data);
}
} class Program
{
static void Main(string[] args)
{
MyThread myThread = new MyThread("hello world"); Thread thread = new Thread(myThread.ThreadMain);
thread.Start(); Console.Read();
}
}
}

这种方法也稍有繁琐,也不是我重点想要探讨的,如果需要,自己也可以使用。 
3. 方式三:采用lambda表达式

对于lambda表达式不熟悉的可以查看微软MSDN上的说明文档。此处假设你熟悉。因为在大多数使用委托的时候我们一般也可以用lambda表达式的。

using System;
using System.Threading; namespace ThreadWithParameters
{
class Program
{
static void Main(string[] args)
{
string hello = "hello world"; //如果写成Thread thread = new Thread(ThreadMainWithParameters(hello));这种形式,编译时就会报错
Thread thread = new Thread(() => ThreadMainWithParameters(hello));
thread.Start(); Console.Read();
} static void ThreadMainWithParameters(string str)
{
Console.WriteLine("Running in a thread,received: {0}", str);
}
}
}

此方法三可以作为推荐方法,代码简便,方便我们使用。上面方式三说到lambda表达式,既然lambda表达式可以使用,那么我们也可以使用delegate委托。下面主要探讨的是使用这种方法。 
4. 方式三:使用delegate委托

Multhd = new Thread[ThreadCount];
thread_Separate_baseCount = C_num / ThreadCount;//每个线程的终端数
listViewEx2.Items.Clear();
for (int j = 0; j < ThreadCount; j++)
{
if (j == ThreadCount - 1)//最后一个线程
{
Multhd[j] = new Thread(delegate() { Run2( j * thread_Separate_baseCount, C_num - 1); });
}
else//其它线程
{
Multhd[j] = new Thread(delegate() { Run2( j * thread_Separate_baseCount, (j + 1) * thread_Separate_baseCount - 1); });
}
}

上面代码Run(arg1,arg2.....,argn)是我们自定义的方法,在这个方法中我们可以设置任意多个参数,看也算是简单的吧。

以上代码完全可以运行,也不会出现bug什么之类的,但是实际运行情况却令我惊讶不已,用for循环创建一个线程时,关闭重开线程不会有任何问题。因为只是一个线程,可能没有什么事。但是至二个或者二个以上时,关闭再重开线程(我需要不断关闭打开终端),程序不会报错,调试器也没有什么问题,电脑有时会毫无预兆的关机,在我们做事时毫无预兆的关机这可是一个致命的问题啊,没有谁愿意这样的。以为是偶然,重复了多次结果都一样,偶然也必然存在这种必然。

为什么一个线程时没事,多个线程时运行时是不是上面的线程都指向了同一个delegate委托的地址,才导致这样会毫无预兆的关机?这些等待我们去验证,在此热烈欢迎有经验的朋友和我一块探讨。

C# 中传递多个参数给多线程的更多相关文章

  1. MyBatis 中传递多个参数的 4 种方式

    方式 1 :封装成对象入参  #{对应实体类的属性} //UserMapper.java 接口 /** * 多条件查询:根据用户名称(模糊查询)和用户角色查询用户列表(参数:对象入参) * @para ...

  2. Mybatis中传递多个参数的方法总结

    一.单个参数: public List<XXBean> getXXBeanList(String xxCode); <select id="getXXXBeanList&q ...

  3. Mybatis接口中传递多个参数

    1.接口 public interface MemberMapper { public boolean insertMember(Members member); public Members sel ...

  4. 使用NSOperation使用,创建线程中传递多个参数

    参考:http://blog.csdn.net/dqjyong/article/details/7677557 参考:http://stackoverflow.com/questions/232761 ...

  5. struts2 action中传递两个参数到url

    <action name="outInDetail" class="formManage_outInDetailAction"> <resul ...

  6. vue v-show与v-for同时配合v-bind使用并在href中传递多个参数的使用方法

    最近在项目中,因为还没使用前端构建工具,还在使用vue+jquery方法渲染页面 碰到几个小问题,在此记录下作为vue学习之路上的一个小知识点 需求:1.数据列表存在与否状态,没有数据显示默认提示,有 ...

  7. A标签中传递的中文参数到Servlet 后台request.getParameter()接收时出现中文乱码

    package util; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequ ...

  8. MyBatis 示例-传递多个参数

    映射器的主要元素: 本章介绍 select 元素中传递多个参数的处理方式. 测试类:com.yjw.demo.MulParametersTest 使用 Map 传递参数(不建议使用) 使用 MyBat ...

  9. spring mvc 后端获得前端传递过来的参数的方法

    1.通过HttpServletRequest 获得 HttpServletRequest.getParameter(参数名),可以获得form表单中传递的参数,或ajax或url中传递过来的参数,如果 ...

随机推荐

  1. 使用cocos2d-x 3.2下载图片资源小例子

    cocos2d-x(ios)下载资源可以使用以下两种方式: 第一种使用libcurl下载图片 使用这种方法需要注意的是,我们需要引入libcurl.a这个库,同时配置对应的库目录和头文件目录具体方法是 ...

  2. uber优步提高成单率,轻松拿奖励!

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. Samsung Galaxy S II GT-I9100 指令全集 部分指令请慎用

    英文版 谷歌翻译 Obtain/Change Device Information *#06# (Display IMEI number) *#1234# (Display current firmw ...

  4. No package identifier when getting name for resource number 0x00000000

    貌似在新版本的SDK下有时会出现标题的这个warning~  如下: 思前想后也不知道这个到底是说的哪里的问题,在逛谷歌的时候无意中发现有人说是因为xml中color的参数直接写成: android: ...

  5. POJ 3170 Knights of Ni (暴力,双向BFS)

    题意:一个人要从2先走到4再走到3,计算最少路径. 析:其实这个题很水的,就是要注意,在没有到4之前是不能经过3的,一点要注意.其他的就比较简单了,就是一个双向BFS,先从2搜到4,再从3到搜到4, ...

  6. hdoj 1404 Digital Deletions(博弈论)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1404 一看就是博弈论的题目,但并没有什么思路,看了题解,才明白 就是求六位数的SG函数,暴力一遍,打表 ...

  7. 使用XML与远程服务器进行交互

    最近在做的一个项目其中的一部分是与远程服务器进行交互,确定身份验证的合法性,于是编写了SendRequest方法 此方法发送给远程服务器XML请求,服务器经过处理后,返回XML回应,由此方法接收到后进 ...

  8. Lync2010升级到2013之账户启用!

    打开ADUC,将用户添加到 csadministrator 组中:

  9. C#之 HashSet(临时笔记,未参考资料,请慎重)

    HashSet是一个集合,类似于DataSet,但是其主要用途是用来存放同一种类型的元素(string.row.table等),如果添加的元素跟定义时初始的类型不一致,就会直接编译失败. 例如: Ha ...

  10. COM组件(ActiveX)控件注册失败

    这主要是由于旧版本的falsh player的原因,卸载干净并清理注册表,再次安装flash player即可. 具体方法: 1 在控制面板 卸载程序里面 卸载flash player 2 C:\WI ...