我正在学习多线程编程,遇到了这个问题。具体情况如下:
我在一个窗体上有4个进度条,其中一个用于下载文件,一个用于显示页面加载状态等等……
我需要从不同的线程中控制每个进度条的进度。
问题是我得到了一个InvalidOperationException错误,提示:
跨线程操作无效:尝试访问'progressBar1'控件,它被创建在其他线程中。
我的做法是否有误,还是有人能告诉我如何实现这个功能呢?
我正在学习多线程编程,遇到了这个问题。具体情况如下:
我在一个窗体上有4个进度条,其中一个用于下载文件,一个用于显示页面加载状态等等……
我需要从不同的线程中控制每个进度条的进度。
问题是我得到了一个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);
}
}
private void Form1_Load(object sender, EventArgs e)
{
CheckForIllegalCrossThreadCalls = false;
}
也许这会起作用。