在我的 UI 中,当按下按钮时,将执行以下代码:
backgroundWorker1 = new BackgroundWorker();
backgroundWorker1.WorkerSupportsCancellation = true;
backgroundWorker1.WorkerReportsProgress = true;
backgroundWorker1.DoWork += new DoWorkEventHandler(backgroundWorker1_DoWork);
backgroundWorker1.ProgressChanged += new ProgressChangedEventHandler(backgroundWorker1_ProgressChanged);
backgroundWorker1.RunWorkerCompleted += new RunWorkerCompletedEventHandler(backgroundWorker1_RunWorkerCompleted);
backgroundWorker1.RunWorkerAsync();
这第一次效果很好。当我点击按钮(然后被禁用)时,我仍然可以在后台任务执行时移动窗口并单击内容。但是当后台工作者完成(按钮再次启用)并且我再次按下它时,后台工作者运行,但我不再控制窗口。
我不知道为什么这第二次不起作用。在后台工作程序运行之前或之后我需要做些什么以确保它不会阻塞 UI 线程?
谢谢!
编辑:在backgroundworker ProgressChanged 处理程序中,我更新了一个进度条和显示后台worker 距离的文本标签。它们不断更新,永远不会冻结。但是当我尝试拖动窗口或单击其他控件时,它们只会定期响应。
backgroundworker 访问一个类的实例,该实例是 UI 线程中的全局变量。想法是实例化对象,运行对象从后台工作人员的 DoWork 内部执行的长函数,然后在后台工作人员完成后访问该对象以查看结果。这可以吗?
在后台工作人员的 DoWork 中调用的这个对象的函数内部,访问了几个静态类。这会导致任何类型的线程问题吗?