关于多线程传参问题
来源:互联网 发布:windows update agent 编辑:程序博客网 时间:2024/06/05 15:56
关于多线程传参问题
## 无参数
我们都知道使用多线程最简单的方式是下面这样:
代码
void SomeMethod()
{
//do something
}
void CreateThread()
{
Thread thread = new Thread(new ThreadStart(SomeMethod));
thread.Start();
}
{
//do something
}
void CreateThread()
{
Thread thread = new Thread(new ThreadStart(SomeMethod));
thread.Start();
}
##一个参数
但是如果要是想给SomeMethod方法传入参数的话,发现这种方法不好用了
因为Thread类并不支持这样
但是为了解决这个问题,类库中提供了一个支持的代理
ParameterizedThreadStart
使用它可以支持传入一个参数.注意,是仅仅一个!!
使用以下方法实现
但是假如有多个参数就遇到麻烦了,上述方法只允许一个参数.
代码
void SomeMethod(object arg)
{
// 假如传的是string
// string argStr = (string)arg;
// do something
}
void CreateThread()
{
Thread thread = new Thread(new ParameterizedThreadStart(SomeMethod));
string arg = "Hello World!";
thread.Start(arg);
}
{
// 假如传的是string
// string argStr = (string)arg;
// do something
}
void CreateThread()
{
Thread thread = new Thread(new ParameterizedThreadStart(SomeMethod));
string arg = "Hello World!";
thread.Start(arg);
}
##多个参数
我们有两种方法:
1. 新建一个内部类,包装所有的参数,然后传入这个内部类的一个实例,如下:
代码
void SomeMethod(object myArgs)
{
MyArgs args = (MyArgs)myArgs;
string str = args.HelloString;
//do something
}
void CreateThread()
{
Thread thread = new Thread(new ParameterizedThreadStart(SomeMethod));
MyArgs args = new MyArgs("Hello World!")
thread.Start(args);
}
private class MyArgs
{
string helloString;
public string HelloString
{
get { return helloString; }
set { helloString = value; }
}
MyArgs(string helloString)
{
this.helloString = helloString;
}
}
{
MyArgs args = (MyArgs)myArgs;
string str = args.HelloString;
//do something
}
void CreateThread()
{
Thread thread = new Thread(new ParameterizedThreadStart(SomeMethod));
MyArgs args = new MyArgs("Hello World!")
thread.Start(args);
}
private class MyArgs
{
string helloString;
public string HelloString
{
get { return helloString; }
set { helloString = value; }
}
MyArgs(string helloString)
{
this.helloString = helloString;
}
}
2. 调用方法需要使用的参数存在此方法的类中,代码示例如下:
代码
public class MyThreadHelper {
//要用到的属性,也就是我们要传递的参数
private string helloString;
public string HelloString
{
get { return helloString; }
set { helloString = value; }
}
//包含参数的构造函数
public MyThreadHelper(string helloString)
{
this.helloString = helloString;
}
//要丢给线程执行的方法,本处无返回类型就是为了能让ThreadStart来调用
public void SomeMethod()
{
string helloString = this.helloString;
// do something
}
}
void CreateThread()
{
MyThreadHelper helper = new MyThreadHelper("Hello World!");
Thread thread = new Thread(new ThreadStart(helper.SomeMethod));
thread.Start();
}
//要用到的属性,也就是我们要传递的参数
private string helloString;
public string HelloString
{
get { return helloString; }
set { helloString = value; }
}
//包含参数的构造函数
public MyThreadHelper(string helloString)
{
this.helloString = helloString;
}
//要丢给线程执行的方法,本处无返回类型就是为了能让ThreadStart来调用
public void SomeMethod()
{
string helloString = this.helloString;
// do something
}
}
void CreateThread()
{
MyThreadHelper helper = new MyThreadHelper("Hello World!");
Thread thread = new Thread(new ThreadStart(helper.SomeMethod));
thread.Start();
}
3. 直接在ThreadStart构造函数中添加代理,这种方法不用考虑参数的个数 (感谢 qianlifeng)
代码如下:
ThreadStart starter = delegate { SomeMethod(arg1, arg2, arg3); };
new Thread(starter).Start();
new Thread(starter).Start();
##结束
至此,多线程传不同个数(零到多个)参数都有了解决办法.
要传参数,也可以这样用:
ThreadStart ts = new ThreadStart(delegate {SomeMethod(object o1,object o2....);});
- 关于多线程传参问题
- 关于多线程传参问题
- 关于多线程的问题
- 关于多线程同步问题
- 关于struts2 多线程问题
- 关于多线程的问题
- 关于多线程问题
- 关于多线程的问题
- 关于多线程的问题
- 关于ios多线程问题
- 多线程传参问题
- 关于多线程使用的问题
- 关于fork的多线程问题
- 关于下载工具的多线程问题
- 遇到多线程问题,关于MyDownload
- 关于python的多线程问题
- iOS关于多线程的问题
- 关于IOS中的多线程问题
- JSTL--学习应用记录
- linux下多网卡绑定设置问题
- 用 SecureCRT来上传和下载数据
- 做CEO的左膀右臂 CTO要看未来10年
- 关于多线程传参问题
- 关于多线程传参问题
- 搜索引擎检索技术
- 分析:知识经济时代企业CIO职能转变
- Web 设计师的 50 个超便利工具(上)
- 读研规划,准研究生们看看哦!!!!!!!!!!!!!
- Web 设计师的 50 个超便利工具(下)
- 神奇道人论如何面对官场潜规则
- 网络命令详解
- 新手报到