C# 中传递多个参数给多线程

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委托的地址,才导致这样会毫无预兆的关机?这些等待我们去验证,在此热烈欢迎有经验的朋友和我一块探讨。

时间: 2024-10-10 17:39:14

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

angularjs 中传递非URL参数方法

在目标页面规定接受的参数:$stateProvider.state('page2', {params: {'DATA': null}}) 传参:$state.go('page2', {DATA: 'aaa'}); 目标页面接受参数:控制器注入$stateParams之后可以通过$stateParams.DATA来获取‘aaa’

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

package util; import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import java.util.Se

js的url中传递中文参数乱码,如何获取url中参数问题

一:Js的Url中传递中文参数乱码问题,重点:encodeURI编码,decodeURI解码: 1.传参页面Javascript代码: <script type=”text/javascript”> function send(){ var url = "test01.html"; var userName = $("#userName").html(); window.open(encodeURI(url + "?userName="

转载 C#中使用结构来传递多个参数

C#中当参数超过5个时,建议用结构来传递多个参数. 示例代码如下: 1 public struct MyStruct 2 { 3 public string str; 4 public int number; 5 } 6 7 class Program 8 { 9 static void Main(string[] args) 10 { 11 MyStruct myStruct = new MyStruct(); 12 myStruct.str = "Number :"; 13 myS

Struct2 向Action中传递参数

就是把视图上的值传递到Action定义的方法中 也就是把数据从前台传递到后台 三种方式: 1.  使用action属性接收参数 比如jsp页面: <body> 使用action属性接收参数<a href="user/user!add?name=a&age=8">添加用户</a> </body> 对应的struct.xml <action name="user" class="com.bjsxt.

ajax请求中传递的参数中如果含有特殊字符怎么处理?

在JQUERY AJAX开发中遇到了下面的一个问题,在执行AJAX请求的时候,需要传递一个“50%”的参数,而这个参数中含有特殊字符%.这样的话就会出现问题了,我们知道服务器在发送请求的时候,会将url中的参数转化成类似于“%2C%2F%3F%3A%40%26%3D%2B%24%23”,所以在我们执行含有这样特殊字符的ajax请求的时候就会出现错误,因为我们传递的参数可能发生了变化,也可能由于参数本身中就含有特殊字符所以系统没有办法编译它. 可能会抛出这样的一个异常: 警告: Parameter

如何在url地址栏中直接写数组参数进行传递

今天博主遇到这样一个问题,就是如何在浏览器url地址栏中直接写入数组参数进行传递,问了身边几个同事,都没有找到成功的书写方法.就开始怀疑是否可以在地址栏中直接写入数组进行传递.开始在谷歌,百度进行搜索查询,也是同样没有找到有用的信息. 也许,大家很少遇到这样的情况. 就这样,我自己开始慢慢的尝试书写,将自己熟悉的几种方式全部都试了一遍,依然传递不对.最后在无意情况下,不小心将参数多复制了一个,点击回车,竟然传递成功了,还是数组结果.瞬间成就满满,虽然只是一个简单小应用. 特此,写一贴给广大博友分

java 实现往oracle存储过程中传递array数组类型的参数

注:本文来源于 <  java 实现往oracle存储过程中传递array数组类型的参数  > 最近项目中遇到通过往存储过程传递数组参数的问题, 浪费了N多个小时,终于有点头绪. 具体的代码就不写上了,因为项目中存储过程的调用方法全部是封装好的(好像现在都这样,都姓3层,嘿嘿) 原理: 1.一维数组 A.单纯的一维数组的话,直接建立一个table类型就可以 1 TYPE TYPE_VARCHAR AS TABLE OF VARCHAR2(200); 2.多维数组 A.多维数组就要稍加修改了,如

java基础知识 学习 关于URL中传递的参数含有特殊字符

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了.下表中列出了一些URL特殊符号及编码                                             1. +        URL 中+号表示空格     %2B 2. 空格 URL中的空格可以用+号或者编码 %20 3. /      分隔目录和子目录            %2F 4. ?       分隔实际的 URL 和参数