C#任务无法访问主线程中的控件

时间:2015-12-15 15:54:37

标签: c# multithreading parallel-processing task

使用Winforms,C#,FW 4.5。 我有一个带文本框和gridView的简单表单。 当我开始一个新任务时,它能够访问网格的单元格并更改文本。当我尝试更改文本框文本时,我收到此错误“跨线程操作无效...”

文本框和gridView都在同一个表单上。为什么行为不同?

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:2)

从与启动UI的线程不同的线程访问UI通常是个坏主意。通过将静态属性Control.CheckForIllegalCrossThreadCalls设置为false可以避免异常,但这是一种非常危险的方式。

您应该使用Control.BeginInvoke将执行推迟回UI线程。

因此,您可以将行txtSql.Text = sQuery替换为类似的内容:

void RunChecks()
{
    ...
    SetQueryText(sQuery); // instead of txtSql.Text = sQuery;
    ...
}

delegate void SetTextDelegate(string text);
void SetQueryText(string query)
{
    if (txtSql.InvokeRequired)
    {
        txtSql.BeginInvoke(new SetTextDelegate(SetQueryText), query);
        return;
    }
    txtSql.Text = query;
}

所以SetQueryText检查是否有必要调用Invoke(或BeginInvoke),因为它是从另一个线程调用的。如果是这种情况,则调用BeginInvoke将执行推迟到UI线程并返回。

不幸的是,这仍然使用委托语法而不是lambdas,但也许有更好的语法,我不知道。

您需要对从不同线程访问的所有控件执行此操作。