如何用ParameterizedThreadStart传递参数?实例代码一看就会。

吉云

说起来这个 `ParameterizedThreadStart`,我刚开始捣鼓多线程的时候,还真被它绕进去过一阵子。

那时候接手个小活儿,需要在后台跑个任务,但是,这个任务得知道具体要处理哪个数据。最开始我顺手就用了 `ThreadStart`,写了个方法,然后 `new Thread(new ThreadStart(MyMethod))`,看着挺顺溜。结果一跑,傻眼了,我的 `MyMethod` 是跑起来了,可它不知道要干啥呀!数据传不进去。

我就寻思,这不行,总不能把要处理的数据写死在代码里,那也太蠢了。于是就开始翻资料,看看这 `Thread` 到底还能怎么玩。捣鼓了半天,发现了这个 `ParameterizedThreadStart`。看名字,带参数的,好像有点意思。

如何用ParameterizedThreadStart传递参数?实例代码一看就会。

仔细瞅了瞅用法,,原来是创建一个线程的时候,传进去的方法可以带一个 `object` 类型的参数。然后,在调用 `*()` 的时候,把你要传的数据塞进去。就像这样:

  • 先准备一个方法,比如叫 `DoWorkWithData(object data)`。
  • 然后 `new Thread(new ParameterizedThreadStart(DoWorkWithData))`。
  • `*("我要传的数据")`。

如何用ParameterizedThreadStart传递参数?实例代码一看就会。

看起来是解决了问题。我就赶紧试了试。在 `DoWorkWithData` 方法里,第一件事就是把那个 `object data` 变回我原来的类型,比如是个字符串或者数字啥的。强转一下,能用了!心里还挺美滋滋。

碰到的麻烦事

第一个麻烦:类型转换。 那时候经验少,直接 `(string)data` 就上了。结果有一次传了个 `null` 进去,或者不小心传错类型了,程序直接就崩了。后来学乖了,每次转换前都得加个判断, `if (data is string strData)` 或者 `as` 操作符配合 `null` 检查,麻烦了点,但稳妥。

第二个麻烦:只能传一个参数。 这 `Start()` 方法就认一个 `object`。可我经常需要传好几个东西进去,比如一个ID、一个名字、还有一个状态啥的。这咋办?

一开始我图省事,想过用个数组或者列表 `object[]` 传进去,然后在方法里再一个个拆出来。试了下,也行,但感觉代码不太好看,取用的时候下标容易搞混,万一顺序错了或者少传一个,又是个坑。

后来觉得还是正经点干脆专门为了传参,定义一个小类(class)或者结构体(struct)。把需要传的几个数据都作为这个类的属性。比如:

如何用ParameterizedThreadStart传递参数?实例代码一看就会。

csharp

// 伪代码示意

class MyThreadData {

public int ID { get; set; }

public string Name { get; set; }

public bool Status { get; set; }

如何用ParameterizedThreadStart传递参数?实例代码一看就会。

然后创建线程的时候,`new MyThreadData { ID = 1, Name = "张三", Status = true }`,把这个对象整个传给 `Start()` 方法。在线程方法 `DoWorkWithData` 里,先把 `object data` 转回 `MyThreadData` 类型,然后就能方便地通过 `*`、`*` 这样访问了。代码清晰多了,也不容易出错。

总结一下

这个 `ParameterizedThreadStart` 算是解决了线程创建时传递参数的基本需求。虽然有点绕,特别是处理那个 `object` 参数和传递多个值的时候,需要自己多做一步封装。但总归是提供了一个官方的、还算直接的办法。

现在可能大家用 `Task` 或者lambda表达式更顺手了,可以直接捕获上下文变量,传参更自然。不过了解一下 `ParameterizedThreadStart` 的用法和它背后解决问题的思路,我觉得还是挺有用的,至少知道以前是怎么处理这种场景的。对我来说,当时确实帮我把活儿干完了,也算是实践中学到的一招。

如何用ParameterizedThreadStart传递参数?实例代码一看就会。

免责声明:由于无法甄别是否为投稿用户创作以及文章的准确性,本站尊重并保护知识产权,根据《信息网络传播权保护条例》,如我们转载的作品侵犯了您的权利,请您通知我们,请将本侵权页面网址发送邮件到qingge@88.com,深感抱歉,我们会做删除处理。

目录[+]