控制’progressBar1’从我在业务类中创建的线程以外的线程访问

我在另一个dll中有一个获取大量数据的方法(占用22k行),我需要为用户创建一个进度条。

如果我不异步调用此方法,它会挂起应用程序。 但是当我异步调用它时,我得到错误progressBar1 Control从一个线程访问,该线程不是在它创建的线程上

 private void btnSend_Click(object sender, EventArgs e) { string filePath = tbPath.Text; ETLBusiness etlBusiness = new ETLBusiness(filePath); Task.Run(() => etlBusiness.LoadData(progressBar1)); } 

在这种情况下, backgroundWorker1.RunWorkerAsync不是异步的,它会在循环中停止我的应用程序

 private void btnSend_Click(object sender, EventArgs e) { string filePath = tbPath.Text; ETLBusiness etlBusiness = new ETLBusiness(filePath); Func func = etlBusiness.LoadData; this.backgroundWorker1.RunWorkerAsync(func(progressBar1)); } 

怎么修好了?

你的问题是你的控件存在于线程A上但是你试图通过线程B访问它。这是一个’禁忌’。 请尝试以下代码

 private void btnSend_Click(object sender, EventArgs e) { Task.Run(() => LoadData(System.Threading.SynchronizationContext.Current, progressBar1)); } private void LoadData (System.Threading.SynchronizationContext synchContext, ProgressBar1ObjectType progressBar) { string filePath = tbPath.Text; ETLBusiness etlBusiness = new ETLBusiness(filePath); synchContext.Post(state => etlBusiness.LoadData(progressBar), null); } 

其中’ProgressBar1ObjectType’是progressBar1的类型

这是另一种可能更好的选择:

 Thread _myThread = null; private void btnSend_Click(object sender, EventArgs e) { SynchronizationContext synchContext = SynchronizationContext.Current; _myThread = new Thread(() => LoadData(synchContext, progressBar1)); myThread.Start(); } private void LoadData (System.Threading.SynchronizationContext synchContext, ProgressBar1ObjectType progressBar) { string filePath = tbPath.Text; ETLBusiness etlBusiness = new ETLBusiness(filePath); synchContext.Post(state => etlBusiness.LoadData(progressBar), null); _myThread.Abort(); }