我想同时开多个线程去执行同一块代码,但每个线程又必须有自己的多个参数,不知能否用结构体变量传值实现。(看教程有个传递参数的,但只能传递一个object型的变量。)我的想法(类似于c++里的做法):
struct MyStruct
{
public int iThreadNum;
public string strName;
public int iAge;
public string strSex;
//...
}
MyMethod(MyStruct mystruct)
{
int iAge = mystruct.iAge;
//...
}        private void button1_Click(object sender, EventArgs e)
        {
            MyStruct mystruct = new MyStruct[20];
            mystruct[0].iAge = 21;mystruct[1].iAge = 23;//...
            for(int i = 0;i<20;i++)
             {
               Thread thread = new Thread(new ParameterizedThreadStart(myThreadMethod));
               thread.Start(mystruct[i]);
              }
             return;
        }上面我这种写法肯定不对,但表达的意思正是我想要的,请高手指教!

解决方案 »

  1.   

    当然不对,但是错误和线程无关...而是struct的用法是错的...先看看书...ParameterizedThreadStart委托传递的变量可以是任何数据类型...结构当然可以传...
      

  2.   


    /// <summary>
            /// 包裹参数的类
            /// </summary>
            class ParamWrapper {
                public int param1 = 0;
                public string param2 = "some str";
                public DateTime param3 = new DateTime(2009, 1, 1);
            }        /// <summary>
            /// 线程函数
            /// </summary>
            /// <param name="paramWrapper">
            /// 输入参数
            /// </param>
            void ThreadFunc(object paramWrapper) {
                // 直接将输入参数类型转换为ParamWrapper类型
                ParamWrapper param = paramWrapper as ParamWrapper;
                if(param == null) {
                    // 如果转换失败,则什么都不做
                    return;
                }
                // 否则干活....
                Console.WriteLine(param.param1);
                Console.WriteLine(param.param2);
                Console.WriteLine(param.param3);
            }
            private void button1_Click(object sender, EventArgs e)
            {
                for (int i = 0; i < 10; i++) {
                    Thread t = new Thread(new ParameterizedThreadStart(ThreadFunc));
                    t.Start(new ParamWrapper());
                }
            }