使用Winforms,C#,FW 4.5。 我有一个带文本框和gridView的简单表单。 当我开始一个新任务时,它能够访问网格的单元格并更改文本。当我尝试更改文本框文本时,我收到此错误“跨线程操作无效...”
文本框和gridView都在同一个表单上。为什么行为不同?
答案 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,但也许有更好的语法,我不知道。
您需要对从不同线程访问的所有控件执行此操作。