将线程名称添加到线程列表

时间:2018-03-27 01:42:43

标签: c# multithreading

我目前正在进行此练习,我必须将该线程的名称添加到列表中。此练习基于表单,因此使用Windows窗体应用程序。每次用户按下开始按钮时,新线程将在线程名称应添加到列表的同时启动,其中每个线程的名称分配为1,2,3,4 ...等等。

但是每次我使用for循环时它都会给我一个错误'INDEX OUT OF BOUND'我做错了什么?有人可以帮忙吗?

更新

基本上这个练习是参数化的,每次用户按下开始按钮时都需要绘制圆圈。我把我的名单全球化了。

List <Thread> _threadName = new List <Thread>();
private void UI_btnStartThread_Click(object sender, EventArgs e)
{
      //create new thread and the referenced the method
      Thread circleThread = new Thread(new ParameterizedThreadStart(DrawCircle));

      //the data is passed to the thread as an argument
     circleThread.Start(new AddCircle(_cDrawer, Color.FromArgb(_mainRandom.Next(0, 256), _mainRandom.Next(0, 256), _mainRandom.Next(0, 256)), _circleSize));

     for(int i=1;i<5;i++)
     {
          circleThread.Name = i.ToString();
          //assigning to list
          _threadName[i] = circleThread;
     }
}

3 个答案:

答案 0 :(得分:0)

听起来有一些问题。首先,听起来Container View没有足够的元素来处理_threadName的范围。您可以使用i代替List<Thread>来避免此问题,因为它会根据需要增长。

其次,您使用最新线程的信息更新列表中的每个元素。我想你只想附加到列表中,保留任何现有值并添加新线程。

Thread[]

如果教师要求您使用数组,则必须跟踪已存储的线程数:

private List<Thread> _threads = new List<Thread>();

private void UI_btnStartThread_Click(object sender, EventArgs e)
{
    //create new thread and the referenced the method
   Thread newThread = new Thread(new ParameterizedThreadStart(DrawCircle));

   //the data is passed to the thread as an argument
   newThread.Start(new AddCircle(_cDrawer, Color.FromArgb(_mainRandom.Next(0, 256), _mainRandom.Next(0, 256), _mainRandom.Next(0, 256)), _circleSize));

    _threads.Add(newThread);
}

答案 1 :(得分:0)

你做错了几件事。按钮单击 - 您生成1个线程

Thread circleThread = new Thread(new ParameterizedThreadStart(DrawCircle));

            //the data is passed to the thread as an argument
            circleThread.Start(new AddCircle(_cDrawer, Color.FromArgb(_mainRandom.Next(0, 256), _mainRandom.Next(0, 256), _mainRandom.Next(0, 256)), _circleSize));

然后你循环4次并重命名相同的线程并将其添加到_threadName集合(数组)。

for(int i=1;i<5;i++)
{
  circleThread.Name = i.ToString();
  //assigning to list
 _threadName[i] = circleThread;
}

相反做这个(示例代码 - 直接写在这里):

在Form1类

 List<Thread> _AllThreads = new List<Thread>(); // This will hold ref to all threads you create

按钮点击事件中的下一步:

private void UI_btnStartThread_Click(object sender, EventArgs e)
{
     Thread myThrd = new Thread(......)
     myThrd.Name = _AllThreads.Count + 1;
     // Start the Thread here

     _AllThreads.Add(myThrd);
}

答案 2 :(得分:-1)

基本上,此练习已参数化,每次用户按下开始按钮时都需要绘制圆圈。我把我的名单全球化了。

private void UI_btnStartThread_Click(object sender, EventArgs e)
        {

            //create new thread and the referenced the method
            Thread circleThread = new Thread(new ParameterizedThreadStart(DrawCircle));

            //the data is passed to the thread as an argument
            circleThread.Start(new AddCircle(_cDrawer, Color.FromArgb(_mainRandom.Next(0, 256), _mainRandom.Next(0, 256), _mainRandom.Next(0, 256)), _circleSize));

            for(int i=1;i<5;i++)
            {
                circleThread.Name = i.ToString();
                 //assigning to list
                _threadName[i] = circleThread;
            }
        }