线程完全冻结了GUI

时间:2012-05-03 01:34:12

标签: c# multithreading user-interface delegates invoke

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

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

1 个答案:

答案 0 :(得分:1)

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

顺便说一句,你也在UI线程上调用Control.Invoke,这有点奇怪。这让我相信你的问题比你在问题中提出的要多得多,或者你对如何使用Invoke有一个基本的误解。