显示非线程安全任务的“请等待”对话框

时间:2009-11-16 19:17:23

标签: c# dialog multithreading pleasewait

我正在使用第三方库,并且库的某些功能需要很长时间才能执行,所以我想在功能繁忙时显示“请等待”对话框。

通常我会做这样的事情:

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;
}

不幸的是,第三方库不是线程安全的。任何解决方法?有没有办法管理对话框作为后台任务?

3 个答案:

答案 0 :(得分:2)

我认为你误解了“线程安全”的含义。如果您要仅从单个线程调用第三方组件的方法/属性,则该组件不必是线程安全的。请参阅this文章。

此外,我建议你在这种情况下使用background worker类。

HTH

答案 1 :(得分:1)

您几乎需要构建自己的对话框。

一种选择是在计时器等中轮询您的completed标志。

另一种选择是让表单“拥有”任务并使用BackgroundWorker进行进度和完成通知。

答案 2 :(得分:0)

假设您有一个LongTask方法,并且它不是线程安全的。如果该方法正在运行且不需要任何共享变量,那么您可以简单地将其包裹在BackgroundWorker周围,并在任务完成时更新“请稍候”屏幕。

如果某个方法不是线程安全的,那仍然意味着在线程中使用它是安全的,它只取决于它是异步运行多次(危险!)还是同步运行(不是问题)。