private delegate void Runner(); //A delegate, but this attempt didn't work
public void Run()
{
Stager.InstructionsMemory = InstructionsTextBox.Text.Split('\n');
Stager.InintializeLists();
InstructionThread = new Thread[Stager.InstructionsMemory.Length];
PipelineInitializor();
BlockingCollection<Func<object>>[] tasks = new BlockingCollection<Func<object>>[Stager.InstructionsMemory.Length];
PCounterLabelUpdate up = new PCounterLabelUpdate(PCounterLabelUpdater);
MemoryUpdater MemUp = new MemoryUpdater(UpdateMemoryLists);
ButtonControl del = new ButtonControl(ButtonController);
ExecuteBtn.Invoke(del, new bool[] { false, true });
Cycle = 0;
for (APCounter = 0; APCounter < Stager.InstructionsMemory.Length; APCounter++)
{
int i1 = APCounter;
int i = APCounter; //Local Copy of Counter
tasks[i] = new BlockingCollection<Func<object>>();
tasks[i].Add(() => Fetch(i1));
tasks[i].Add(() => Decode(i1));
tasks[i].Add(() => ALURes(i1));
tasks[i].Add(() => Memory(i1));
tasks[i].Add(() => WriteB(i1));
InstructionThread[i] = new Thread(() => Worker(i1, tasks[i1]));
InstructionThread[i1].Start(); //Start a Thread
CycleLbl.Invoke(up); // Update GUI Control
this.Invoke(MemUp); // UPdate GUI
_wait.WaitOne(); //Wait
}
ExecuteBtn.Invoke(del, new bool[] { true, false });
}
GUI完全冻结,不允许我调用set方法。
以上功能是一个线程启动器,我想午餐一定数量的线程,但我想根据条件延迟午餐。我使用for循环,和_wait.WaitOne();
什么电话运行?按钮控件
它被困在哪条线上? _wait.WaitOne()
等待的是什么?的AutoResetEvent
为什么在第一个线程的午餐后呢?我想控制起始线程组,让他们完成工作(“使用业务逻辑”),然后午餐更多线程。
答案 0 :(得分:1)
您正在UI线程上调用AutoResetEvent.WaitOne
。 WaitOne
不会提取消息,因此会导致UI冻结。这里的一般建议是避免在等待来自另一个线程的信号时调用阻止UI线程的任何方法。这可以防止UI线程调度发生的所有事件(如按钮单击,刷新屏幕等)。更糟糕的是,如果使用不当,可能会导致死锁,这可能是您的情况。在没有看到AutoResetEvent
是Set
的情况下我无法确定问题是什么,但在UI线程上调用WaitOne
肯定是个问题。
顺便说一句,你也在UI线程上调用Control.Invoke
,这有点奇怪。这让我相信你的问题比你在问题中提出的要多得多,或者你对如何使用Invoke
有一个基本的误解。