[英]Accessing a form's control from a separate thread
我正在研究线程,并遇到了这个问题。 情况是这样的:
我在单个表单上有4个进度条,一个用于下载文件,一个用于显示页面加载状态等。
我必须从单独的线程控制每个ProgressBar的进度。
问题是我收到一个InvalidOperationException ,它说
跨线程操作无效:从创建该线程的线程之外的其他线程访问控件'progressBar1'。
我在这种方法上错了吗?或者有人可以告诉我如何实现吗?
Control
只能在创建它的线程(UI线程)中访问。
您将必须执行以下操作:
Invoke(new Action(() =>
{
progressBar1.Value = newValue;
}));
然后,invoke方法在UI线程上执行给定的委托。
您可以检查Control.InvokeRequired标志,然后在必要时使用Control.Invoke方法。 Control.Invoke需要一个委托,因此您可以使用内置的Action <T>。
public void UpdateProgress(int percentComplete)
{
if (!InvokeRequired)
{
ProgressBar.Value = percentComplete;
}
else
{
Invoke(new Action<int>(UpdateProgress), percentComplete);
}
}
UI元素只能由UI线程访问。 WinForms和WPF / Silverlight不允许从多个线程访问控件。
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
}
也许这会工作。
您需要从非UI线程调用方法Invoke,以对表单和其他控件执行一些操作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.