使用BeginInvoke禁用表单控件

时间:2012-07-20 13:16:32

标签: c# .net

当我在做一些longTask()线程时,我正在使用以下代码来禁用表单控件。但控件没有被禁用..这是我的disable()方法的代码。

    public void disableFormControls()
    {
        if (InvokeRequired)
        {
            this.BeginInvoke(new Action(disableFormControls));
            return;
        }
        groupBoxInput.Enabled = false;
        groupBoxOutput.Enabled = false;
        btnGen.Enabled = false;
        btnReset.Enabled = false;
    }

以下是我如何称呼它.. 注意:LongTask()将在一个单独的线程中运行。

    private void LongTask()
    {
        disableFormControls();
        Console.WriteLine("Started Records::" + DateTime.Now);
        //Doing my long tasks here 
        enableFormControls();
    }

你能告诉我我错在哪里吗?

3 个答案:

答案 0 :(得分:4)

试试这个,我更改了enableForm的调用,而不是调用disableFormControls。此外,我同步而不是异步执行此操作,因此在UI正确更新之前,后台线程没有执行任何操作。我还假设disableFormControls是表单上的一种方法。

public void disableFormControls()
{
    if (InvokeRequired)
    {
        this.Invoke(new Action(disableFormControls));
        return;
    }
    groupBoxInput.Enabled = false;
    groupBoxOutput.Enabled = false;
    btnGen.Enabled = false;
    btnReset.Enabled = false;
}

答案 1 :(得分:1)

要确保您在UI线程上同步执行代码,请使用Invoke代替BeginInvoke

答案 2 :(得分:1)

这里有两个选择,因为你无法从非UI线程修改winform UI控件

  1. 您可以将启用/禁用UI代码移回UI线程。在启动任务之前,禁用UI线程中的控件,并使用调度程序在任务完成时在UI线程中重新启用它们。

  2. 您可以使用数据绑定将这些控件的启用状态绑定到可以从任何线程自由修改的无UI对象。