0

我正在使用以下代码来禁用表单控件,而我正在执行一些 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();
    }

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

4

3 回答 3

4

试试这个,我将 Invoke 更改为enableFormcall 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;
}
于 2012-07-20T13:21:52.837 回答
1

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

于 2012-07-20T13:20:10.543 回答
1

您在这里有两个选择,因为您不能从非 UI 线程修改 winform UI 控件

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

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

于 2012-07-20T13:23:05.080 回答