0
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()

什么是等待?自动复位事件

为什么是在第一个线程的午餐之后?我想控制启动线程组,让他们完成工作(“使用业务逻辑”),然后午餐更多线程。

4

1 回答 1

1

您正在调用AutoResetEvent.WaitOneUI 线程。WaitOne不会泵送消息,因此会导致 UI 冻结。这里的一般建议是避免在 UI 线程等待来自另一个线程的信号时调用任何阻塞 UI 线程的方法。这可以防止 UI 线程调度所有发生的事件(如按钮单击、刷新屏幕等)。更糟糕的是,如果使用不当,可能会导致死锁,这可能是您的情况。没有看到这AutoResetEvent是怎么回事,Set我不能确定问题是什么,但调用WaitOneUI 线程绝对是一个问题。

顺便说一句,您还调用Control.Invoke了 UI 线程,这有点奇怪。这使我相信,除了您在问题中提出的内容之外,还有很多事情要做,或者您对应该如何Invoke使用存在根本性的误解。

于 2012-05-03T16:56:09.677 回答