//启动n个线程int n = int.Parse(txtMyNum.Text.Trim());//来自于窗口输入,意思是次值是个变的
for (int i = 0; i < n; i++)
            {
                Thread threads[i] = new Thread(new ThreadStart(MainAction));
                 
            }下面是生成线程的时候用的函数------此函数调用Myfun()
MainAction()
{
        ......n多语句        Myfun()        ......n多语句
}Myfun()
{
     在这里怎么获得调用他的线程的那个 i 值????????????????????问题在这里?????????
     下面是根据i值执行不同的动作
}

解决方案 »

  1.   

    你的做法有问题,按照你现在的思路很难实现你所要的。比较正确的做法是,你创建一个线程类,然后把当前线程的一些参数放进去,然后调用的时候即可使用,参看
    http://blog.csdn.net/knight94/archive/2006/03/21/631238.aspx
      

  2.   

    楼上说的对,你定义的thread[]相当于n个指令指针,每一个都指向了你要调用的线程函数,在这里如果你不显示的向里面传递参数,根本不可能获得你要的数据的
    比如你把
    MainAction()和 Myfun()
    封闭在一个类中,类内有一个属性,就是你所说的i,每个线程你实例一次这个类,传递不同的i值,能类的实例调用MainAction()
      

  3.   

    .NET 1.0 只能像愚翁说的那样做..NET 2.0 解决方法:1) 有一个带参的 ParameterizedThreadStart (好像是这么拼写) 类, 创建线程的时候可以加入用户参数.2) 用匿名方法如 :ThreadStart starter = delegate() {
      MainAction(i); // 在这里调用参数.
    }
    Thread th = new Thread(starter);
    th.start();
    ....
      

  4.   

    其实我的想法很简单:就是起动  n个线程,  这n个线程各自和数据库建立一个连接------就是n个连接了-----当然n不是很大的那种,我最大用到1000。然后各个线程,用自己建立的连接执行各自的操作,比如update,select,delete,create等
    总之就是搞他们并发, 而不是: 打开、执行、关闭;然后在打开、执行、关闭来循环,导致所有用户排队等候那一个连接
    哪位大峡有好思路????
      

  5.   

    怎么不可能呢,我用4路,8G RAM服务器,来访问 4节点 oracle 数据库服务器
      

  6.   

    嘿嘿,下面我已经实现的多用户并发,各自建立各自的连接
    在本人笔记本上的 测试数据如下:
    1分钟,1用户    插入数据 25141 行
    1分钟,2用户    插入数据 31576 行
    2分钟,2用户    插入数据 57719 行
    2分钟,3用户    插入数据 61786 行插入数据条数不是我想象的成倍数关系,不知道为什么???????????
    高手们帮我诊断一下啊public partial class SQLServerFrm : Form
        {
            const int jimNum = 300;//启动线程数目        static internal Thread[] threads = new Thread[jimNum];
            //本地测试来连接 SQL 2005
            private string connectionString = global::SQLloader.Properties.Settings.Default.Jim_EIM_DataConnectionString1;
            //与数据库的连接
              private SqlConnection[] myConnection = new SqlConnection[jimNum];//对应于线程的数据库连接
            private SqlCommand[] tempSqlCommand = new SqlCommand[jimNum];];//对应于线程的command
            private int iUserNum = 0;//并发用户数初始话,实际的值从界面的文本框获取
            int iRuntime = 0;//运行时间长度,实际的值从界面的文本框获取
            
            private DateTime dtStartTime;//运行开始时间
            private DateTime dtEndTime;//运行结素时间        public SQLServerFrm()
            {
                InitializeComponent();
            }        //点运行按牛的动作
            private void btnRun_Click(object sender, EventArgs e)
            {
                //开始运行的时间
                dtStartTime = DateTime.Now;            //获取运行时间长度
                iRuntime =int.Parse(txtRunTime.Text.Trim())*60;//转换成秒
                if (iRuntime <= 0)
                {
                    MessageBox.Show("请输入一个大于0的数字!");
                    return;
                }            //获取并发用户数目
                iUserNum = int.Parse(txtUserNum.Text.Trim());
                if ((iUserNum <= 0) || (iUserNum > 300))
                {
                    MessageBox.Show("并发用户数请输入一个大于0且小于300的数字!");
                    return;
                }            //点运行按纽的时候,打开计时器
                timerRunTime.Enabled = true;
                //timerRunTime.AutoReset = false;
                timerRunTime.Interval = iRuntime * 1000;//把运行的时间长度当作及时器的周期
                timerRunTime.Start();            //根据并发用户数,生成运行的线程
                for (int i = 0; i < iUserNum; i++)
                {
                    Thread t = new Thread(new ParameterizedThreadStart(MainAction));
                    threads[i] = t;
                }
                for (int i = 0; i < iUserNum; i++)
                {
                    threads[i].IsBackground = true;
                    threads[i].Start(i);
                    Thread.Sleep(2);
                    
                }
            }        //结束按纽的动作
            private void btnStop_Click(object sender, EventArgs e)
            {
                //结束所有操作数据库的线程
                
                KillAllThreads(iUserNum);
                
            }        //
                  //执行SQL语句----如insert,delete,update等
            private void ExecSQL(string strSQL,int iSQL)
            {
                try
                {
                    if ((myConnection[iSQL] == null) || (myConnection[iSQL].State == ConnectionState.Closed) || (myConnection[iSQL].State == ConnectionState.Broken))
                    {
                        myConnection[iSQL] = new SqlConnection(connectionString);
                        tempSqlCommand[iSQL] = new SqlCommand(strSQL, myConnection[iSQL]);
                        tempSqlCommand[iSQL].Connection.Open();
                        tempSqlCommand[iSQL].ExecuteNonQuery();//???
                        tempSqlCommand[iSQL].Dispose();
                    }
                    else
                    {
                        myConnection[iSQL].Close();
                    }
                   
                }
                catch (Exception e)
                {
                    MessageBox.Show(e.ToString());
                    return;
                }
                finally
                {
                    myConnection[iSQL].Close();
                }
            }        //终止所有进程
            private void KillAllThreads(int iRunUser)
            {
                for (int i = 0; i < iRunUser; i++)
                {
                    if (threads[i].IsAlive)
                    {
                        threads[i].Abort();
                    } 
                }            //停止记时器
                timerRunTime.Stop();
                           
            }        private void timerRunTime_Tick(object sender, EventArgs e)
            {
                //到第一个及时器周期结素杀掉所有
                KillAllThreads(iUserNum);
                MessageBox.Show("运行结束!");
                return;
            }
            //
            private void MainAction(object data)
            {
                int idata = Int32.Parse(data.ToString());            TimeSpan ts;
                int differenceInSeconds = 0;
                //根据设定的时间长度来循环
                while (differenceInSeconds <= iRuntime)
                {
                    
                    string insertSQL = "insert AMERCE (AMERCEID,PWORD,PID) values ('jim3','aa','bb')";
                    ExecSQL(insertSQL,idata);                
                    dtEndTime = DateTime.Now;
                    ts = dtEndTime - dtStartTime;
                    differenceInSeconds = ts.Seconds;                
                }
            }
                    
            //
        }
      

  7.   

    小弟初学C# 水平很菜,说个想法 不对的话大家别笑我,
    //启动n个线程int n = int.Parse(txtMyNum.Text.Trim());//来自于窗口输入,意思是次值是个变的
    for (int i = 0; i < n; i++)
                {
                    Thread threads[i] = new Thread(new ThreadStart(MainAction));
                     XXXXXXXXXX 在这里把I值赋给这个新建线程的NAME属性
                }下面是生成线程的时候用的函数------此函数调用Myfun()
    MainAction()
    {
            ......n多语句        Myfun()        ......n多语句
    }Myfun()
    {在这里用CURRENTTHREAD.NAME获取I值
    然后按你的需要用SWITCH语句来做不同的操作
       
         在这里怎么获得调用他的线程的那个 i 值????????????????????问题在这里?????????
         下面是根据i值执行不同的动作
    }
      

  8.   

    for (int i = 0; i < iUserNum; i++)
                {
                   //传入参数
                    mainAction m = new mainAction( i );
                    Thread t = new Thread(new ParameterizedThreadStart( m.workstart));
                    threads[i] = t;
                }
    public class mainAction
    {
       //线程传入的参数
       private int m_ThreadNum;
       
        public mainAction( int ThreadNum )
       {
           this.m_ThreadNum = ThreadNum 
       }   public void workstart()
       {
          int j = this.m_ThreadNum
       }
    }
      

  9.   

    本问题总结:celas(长刀公主)   的 第一个想法可以实现,大家鼓掌......progneo,想的明显不行,name里面哪来的i值?kmblack1(black),你用的还是一个连接啊,不是并发吧Knight94(愚翁)和ThreadSharp(ThreadSharp V2006)  的建议很好,以后咱要多学习
      

  10.   

    本问题总结:celas(长刀公主)   的 第一个想法可以实现,大家鼓掌......======================================delegate 不行吗 ?我觉得匿名方法更直观呢.
      

  11.   

    用Delegate的BeginInvoke就可以了
    delegate void MyFunDelegate(int index)for (int i = 0; i < n; i++)
    {
          MyFunDelegate md = new MyFunDelegate();
          md.BeginInvoke(i,null,null);
    }MyFun(int index)
    {
       bla... bal....
    }
      

  12.   

    为thread设置名称,通过名称区分呢?
    int n = int.Parse(txtMyNum.Text.Trim());//来自于窗口输入,意思是次值是个变的
    for (int i = 0; i < n; i++)
                {
                    Thread threads[i] = new Thread(new ThreadStart(MainAction));
    threads[i].name = "thread"+i;
                     
                }
      

  13.   

    mainAction[i] m=new mainAction[iUserNum];
    Thread[] t = new Thread[iUserNum];
    for (int i = 0; i < iUserNum; i++)
                {
                   //传入参数
                    m[i] = new mainAction( i );
                    t[i] = new Thread(new ParameterizedThreadStart( m.workstart));
                    t[i].Start();
    }
    有空多看点书