我正在使用第三方库,并且库的某些功能需要很长时间才能执行,所以我想在功能繁忙时显示“请等待”对话框。
通常我会做这样的事情:
Thread longTask = new Thread (new ThreadStart(LongTask));
longTask.IsBackgroud = true;
longTask.Start();
pleaseWaitForm = new PleasWaitForm ("Please wait for task to complete");
pleaseWaitForm.ShowDialog();
void LongTask()
{
// Do time consuming work here
pleaseWaitForm.CanCloseFlag = true;
}
不幸的是,第三方库不是线程安全的。任何解决方法?有没有办法管理对话框作为后台任务?
答案 0 :(得分:2)
我认为你误解了“线程安全”的含义。如果您要仅从单个线程调用第三方组件的方法/属性,则该组件不必是线程安全的。请参阅this文章。
此外,我建议你在这种情况下使用background worker类。
HTH
答案 1 :(得分:1)
您几乎需要构建自己的对话框。
一种选择是在计时器等中轮询您的completed
标志。
另一种选择是让表单“拥有”任务并使用BackgroundWorker
进行进度和完成通知。
答案 2 :(得分:0)
假设您有一个LongTask方法,并且它不是线程安全的。如果该方法正在运行且不需要任何共享变量,那么您可以简单地将其包裹在BackgroundWorker
周围,并在任务完成时更新“请稍候”屏幕。
如果某个方法不是线程安全的,那仍然意味着在线程中使用它是安全的,它只取决于它是异步运行多次(危险!)还是同步运行(不是问题)。