c# – BackgroundWorker – 跨线程操作无效

前端之家收集整理的这篇文章主要介绍了c# – BackgroundWorker – 跨线程操作无效前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个winform应用程序(一个窗体),在这个窗体上有一个RichTextBox.在这个表单的构造函数中,我创建了MyClass类的一个实例.在“Form_Load”中,我调用MyClass实例的初始化方法.

在表单构造函数

  1. myClass = new MyClass(RichTextBox richTextBox);

在Form_Load

  1. myClass.Initialisation();

在初始化方法中,在循环中,我读了一些参数,做其他的东西.要冻结应用程序(因为某些操作可能需要一段时间,几秒钟),我使用了BackgroundWorker.我这样使用(见下面的代码).

当我执行,我得到这个错误:跨线程操作无效:控制’richTextBox
从除了创建的线程之外的线程访问.

你能告诉我怎么解决这个问题吗?当我不访问richTextBox时,工作完美

  1. public Class MyClass
  2. {
  3. static BackgroundWorker _bw;
  4. public MyClass()
  5. {
  6. _bw = new BackgroundWorker
  7. {
  8. WorkerReportsProgress = true,WorkerSupportsCancellation = true
  9. };
  10. _bw.DoWork += bw_DoWork;
  11. _bw.ProgressChanged += bw_ProgressChanged;
  12. _bw.RunWorkerCompleted += bw_RunWorkerCompleted;
  13. }
  14. static void bw_DoWork(object sender,DoWorkEventArgs e)
  15. {
  16. foreach (....)
  17. {
  18. if (....)
  19. {
  20. richtextBox.Text.AppendText("MyText");
  21. }
  22. }
  23. e.Result = true;
  24. }
  25. static void bw_RunWorkerCompleted(object sender,RunWorkerCompletedEventArgs e){}
  26. static void bw_ProgressChanged(object sender,ProgressChangedEventArgs e){}
  27. }

解决方法

使用BackgroundWorker不会免除您正常的线程规则,例如只有UI线程可以访问UI组件.

如果要从BackgroundWorker更新用户界面,而不是使用进度/完成事件(在UI线程上引发),则需要像其他情况一样使用Control.Invoke/Control.BeginInvoke.例如:

  1. if (....)
  2. {
  3. Action action = () => richtextBox.Text.Add("MyText");
  4. richtextBox.Invoke(action); // Or use BeginInvoke
  5. }

猜你在找的C#相关文章