1

我正在使用第 3 方库,并且该库的某些功能需要很长时间才能执行,因此我想在功能繁忙时显示“请稍候”对话框。

通常我会做这样的事情:

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 方库不是线程安全的。任何解决方法?有没有办法将对话框作为后台任务进行管理?

4

3 回答 3

2

我认为您误解了“线程安全”的含义。如果您打算仅从单线程调用 3rd 方组件的方法/属性,则该组件不必是线程安全的。见这篇文章。

此外,我建议您在这种情况下使用后台工作人员类。

高温高压

于 2009-11-16T19:30:07.037 回答
1

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

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

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

于 2009-11-16T19:23:16.130 回答
0

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

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

于 2009-11-16T19:25:23.847 回答