从单独的线程访问表单的控件
我正在练习线程并遇到了这个问题。 情况是这样的:
-
我在一个表单上有4个进度条,一个用于下载文件,一个用于显示页面加载状态等…
-
我必须从一个单独的线程控制每个ProgressBar的进度。
问题是我收到了一个InvalidOperationException
跨线程操作无效:控制’progressBar1’从其创建的线程以外的线程访问。
我错了这种方法还是有人能告诉我如何实现这个?
UI元素只能由UI线程访问。 WinForms和WPF / Silverlight不允许从多个线程访问控件。
可以在此处找到解决此限制的方法 。
Control
只能在创建它的线程(UI线程)中访问。
你必须做类似的事情:
Invoke(new Action(() => { progressBar1.Value = newValue; }));
然后,invoke方法在UI线程上执行给定的委托。
您可以检查Control.InvokeRequired标志,然后根据需要使用Control.Invoke方法。 Control.Invoke接受委托,因此您可以使用内置的Action
public void UpdateProgress(int percentComplete) { if (!InvokeRequired) { ProgressBar.Value = percentComplete; } else { Invoke(new Action(UpdateProgress), percentComplete); } }
private void Form1_Load(object sender, EventArgs e) { CheckForIllegalCrossThreadCalls = false; }
也许这会奏效。
您需要从非UI线程调用方法Invoke来对表单和其他控件执行某些操作。
- 比较两个列表以搜索常见项目
- 在C#中使用MySQLConnection无法正常关闭
- C# – 干净地关闭OpenVPN
- 复制具有不同命名空间的两个相同对象(递归reflection)
- 如何validationRadioButtonList是否在C#中检查/选择它?
- 带有Specflow的DataSource属性,用于多个浏览器测试
- 访问HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Installer \ UserData
- 嵌套LINQ返回此方法无法转换为存储表达式exception
- JPEG解压缩在Windows体系结构中不一致