给定一个听起来像这样的任务:
使用键盘输入组装玩具的机器人数量和组装套件的数量。玩具组装套件的数量必须超过机器人数量至少100倍。每个机器人在一定时间内收集一个玩具,该玩具落在用户从键盘输入的范围内。当玩具组装完毕后,机器人会取出一套新的玩具来拼搭玩具,直到所有的套件都组装完毕。每个机器人都在单独的线程中运行。
要求:
ListBox 需要显示有关进程进度的信息。需要在ListBox中体现的事件:
- 机器人 #n 开始收集集合 #m。试剂盒收集时间:x分钟;
- 机器人#n 已完成收集#m 组;
- 组装套件已经出来了。
代码:
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
public bool stop;
List<Thread> threads = new List<Thread>();
int[] robots;
int numberSets = 0;
Random random = new Random();
object locker = new object();
//List<int> sets = new List<int>();
//List<int> setss;
public Form1()
{
InitializeComponent();
stop = false;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
foreach (Thread thread in threads)
{
thread.Abort();
}
}
private void button1_Click(object sender, EventArgs e)
{
if (Convert.ToInt32(numberRobots.Text) * 100 <= Convert.ToInt32(numberSet.Text))
{
robots = new int[Convert.ToInt32(numberRobots.Text)];
for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
{
robots[i] = i + 1;
}
for (int i = 0; i < Convert.ToInt32(numberRobots.Text); i++)
{
threads.Add(new Thread(new ParameterizedThreadStart(CreatSet)));
threads[i].Name = $"Робот {i + 1}";
threads[i].Start(Convert.ToInt32(robots[i]));
}
}
else
{
Console.WriteLine("Неправильно!");
}
}
public void CreatSet(object obj)
{
int numberRobot = (int)obj;
while (numberSets != Convert.ToInt32(numberSet.Text))
{
lock (locker)
{
numberSets++;
infAssembly.Items.Add($"• {Thread.CurrentThread.Name} начал сбор набора №{numberSets}. Время сбора набора: {random.Next(50, 100)} секунд;"); //<-- Ошибка
}
infAssembly.Items.Add($"• {Thread.CurrentThread.Name} закончил сбор набора №{numberSets}.");
Thread.Sleep(random.Next(50, 100));
}
infAssembly.Items.Add("•Наборы для сборки закончились.");
}
}
}
但在做的时候,总是会出现问题。每次按下按钮时,都会出现未处理的异常,如屏幕截图所示,引用块的第 88 行(在代码中注明)。请告诉我如何解决这个异常?
发生的异常是:
System.InvalidOperationException: "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления `infAssembly` не из того потока, в котором он был создан"


