我正在尝试在petrel中开发一个多线程插件,我的算法在两个独立的线程中运行。该插件似乎工作正常,除了我找不到任何方法来更新进度条。
使用Invoke不会更新进度条(c#进度条),我的UI在执行期间完全冻结。
当algo正在运行时,有没有办法更新进度条(petrel进度或标准进度条)来自另一个线程?
由于
答案 0 :(得分:4)
使用Slb.Ocean.Petrel.PetrelLogger.NewAsyncProgress(String, ProgressType)
或NewAsyncProgress(String, ProgressType, AsyncProgressCanceledCallback, Object)
从后台主题更新进度条。
答案 1 :(得分:2)
只有在未阻止UI线程的消息处理时,Control.Invoke才有效。如果主线程正在等待结果,则需要定期调用Application.DoEvents。
关于Petrel进度条:如果不允许用户交互,通常使用简单的进度条,Petrel被阻塞直到操作完成,而如果最终用户开始某些操作但是他能够使用一个或多个异步进度条当操作在后台运行时工作。
如果您选择第一种方法,您可以例如将进度存储在每个线程可见的变量中(确保变量被正确锁定),主线程可以定期在循环中读取该变量并相应地更新进度。