在winform代码中通过startUpload方法开启线程,并使用委托将UploadProBar方法传递给aws对象的TestPgBar方法,然后再进行调用,但是报异常System.InvalidOperationException:“线程间操作无效: 从不是创建控件“pgBar”的线程访问它 如何解决
不想用 取消跨线程检查 这种方法解决!!希望网友给出解决方案!!
在winform代码中通过startUpload方法开启线程,并使用委托将UploadProBar方法传递给aws对象的TestPgBar方法,然后再进行调用,但是报异常System.InvalidOperationException:“线程间操作无效: 从不是创建控件“pgBar”的线程访问它 如何解决
不想用 取消跨线程检查 这种方法解决!!希望网友给出解决方案!!
引自免费微信小程序:皆我百晓生
在Windows Forms应用程序中,控件只能在其创建的线程上进行操作。您遇到的错误是因为尝试从非UI线程更新进度条(pgBar)控件。为了解决这个问题,并且不使用“取消跨线程检查”(Control.CheckForIllegalCrossThreadCalls = false),您可以使用Invoke或BeginInvoke方法来安全地在UI线程上执行更新操作。
下面是一个示例代码片段,展示如何通过委托和Invoke方法解决此问题:
using System;
using System.Windows.Forms;
public class YourForm : Form
{
private ProgressBar pgBar; // 假设这是您的ProgressBar控件
public void StartUpload()
{
Thread uploadThread = new Thread(() =>
{
// 模拟上传过程
for (int i = 0; i <= 100; i++)
{
// 使用Invoke确保在主线程上调用UpdateProgress方法
if (pgBar.InvokeRequired)
{
pgBar.Invoke(new Action<int>(UpdateProgress), i);
}
else
{
UpdateProgress(i);
}
// 模拟耗时操作,如:Sleep
Thread.Sleep(50);
}
});
uploadThread.Start();
}
private void UpdateProgress(int value)
{
pgBar.Value = value;
}
}
在这个例子中,StartUpload
方法在一个单独的线程上运行上传任务。在上传过程中,每当需要更新进度条时,它首先检查是否需要调用 Invoke,然后通过一个Action委托将 UpdateProgress
方法传递到主线程执行。这样就能确保在正确的线程上下文中更新UI控件,从而避免了线程间操作无效的异常。