如果这很简单,请原谅我。我来自嵌入式RToS世界并且仅仅为了生产的测试设备而学习了c#。我想我已经解决了所有明显的问题,只是任务没有达到预期的效果。
我有一个带有10个串口和其他附件的测试夹具,一个非常基本的窗口形式UI,需要同时运行10个列表框。我已将代码缩减到问题演示所需的内容(无串口等)
我无法正确地从10个任务中获取10个列表框(或文本框)。我可以轻松地一次做一个,甚至5个作品,但10个并不起作用。
我的异常超出了范围,因为它以某种方式传递了10,但我只传递0-9所以我现在将任务数减少到9直到我理解了基本问题。
private void buttonStart_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() => PTT.ProductionTest());
}
这是来自PTT课程的任务,它将管理和监控10个任务,以便UI仍然响应
public static void ProductionTest()
{
//Somewhere to store the tasks
List<Task> TestSlotTasks = new List<Task>();
//Create the tasks for each of the test slots
for (int i = 0; i != 9; ++i)
{
TestSlotTasks.Add(Task.Factory.StartNew(() => new PTT().TestSlot(i)));
Program.ListBoxAddLine(string.Format("CALL[{0}]: task start/stop test", i), System.Drawing.Color.LawnGreen, i);
}
Task.WaitAll(TestSlotTasks.ToArray());
}
这应该是一个非静态程序,所以我可以创建多个实例(所以我可以多次运行它没有问题,无论如何,这是我的意图,对吗?)
private void TestSlot(int slot)
{
for (var z = 0; z != 10; ++z)
{
Program.ListBoxAddLine(string.Format("PTT[{0}]: task start/stop test", slot), System.Drawing.Color.LawnGreen, slot);
}
}
这是我用来更新listBox的调用方法。列表框位于通用列表中,如下所示
//ListBoxs.Add(listBoxSlot1); //Done for each of the 10 list box's to put in a list
//This is the method that will add a line to the main text box and to the log file
public static void ListBoxAddLine(string TextToAdd, System.Drawing.Color textColor, int slot)
{
//Update the list box on the main screen
if (mainForm != null)
{
if (FormPTT.ListBoxs[slot].InvokeRequired)
{
FormPTT.ListBoxs[slot].Invoke((MethodInvoker)delegate ()
{
FormPTT.ListBoxs[slot].ForeColor = textColor;
FormPTT.ListBoxs[slot].TopIndex = FormPTT.ListBoxs[slot].Items.Add(TextToAdd);
});
}
else
{
FormPTT.ListBoxs[slot].ForeColor = textColor;
FormPTT.ListBoxs[slot].TopIndex = FormPTT.ListBoxs[slot].Items.Add(TextToAdd);
}
}
}
如果我在这个例子中超过5或6个列表框,我得到的输出是非常随机的。
使用上面的代码,我得到了这个
output in the list box's, ignore the other stuff
所以它直到第8个插槽都显示,它显示Call [7]任务开始/停止但是任务调用没有任何内容,9和10都没问题,但是我没有调用它10次,所以如何更新10 ?我不通过10?哪个是8的PTT [7] ...输出?
我认为我只是不了解有关任务的一些事情......