private void button1_Click(object sender, EventArgs e)
{
PROGRESS_BAR.Minimum = 0;
PROGRESS_BAR.Maximum = 100;
PROGRESS_BAR.Value = 0;
for (int i = 0; i < 100; i++)
{
Thread t = new Thread(new ThreadStart(updateProgressBar));
t.IsBackground = true;
t.Start();
}
}
private void updateProgressBar()
{
PROGRESS_BAR.PerformStep();
Thread.Sleep(4000);
}
我总是收到此错误: 跨线程操作无效:控制''从创建它的线程以外的线程访问。
我试图在谷歌搜索解决方案,不幸的是所有这些都不适合我。有没有人知道如何解决这个问题? 提前谢谢..
答案 0 :(得分:5)
您无法与非UI线程中的UI元素进行交互。 你需要使用像
这样的代码this.BeginInvoke((Action)(() => PROGRESS_BAR.PerformStep()));
答案 1 :(得分:2)
您应该使用BackgroundWorker
component及其ProgressChanged
事件。
您可以在ReportProgress
处理程序(在后台线程上运行)中调用DoWork
方法,然后更新ProgressChanged
处理程序中的进度条(在UI线程上运行) )。
如果你真的想自己做(没有BackgroundWorker),你可以致电BeginInvoke
答案 2 :(得分:0)
您的所有UI交互(包括回调,属性集和方法调用)必须位于同一个线程上。
其中一个回调可以启动另一个线程(或许多线程),但它们无法直接更新UI。处理更新的方法是通过数据属性。我的处理线程将更新进度状态属性。这是由UI线程读取的,它具有用于进度条的常规(100ms)更新的计时器。
如果这样做,您将需要锁定用于通信状态更新的任何对象(例如,字符串)。