C# 显示一个";请稍等;非线程安全任务的对话框

C# 显示一个";请稍等;非线程安全任务的对话框,c#,dialog,multithreading,pleasewait,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"); pleaseWaitFo

我正在使用第三方库,库中的一些函数需要很长时间才能执行,因此我希望在函数繁忙时显示“请稍候”对话框

通常我会这样做:

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

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

您非常需要构建自己的对话框

一个选项是在计时器等中轮询您的
completed
标志


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

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


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

我想你误解了“线程安全”的含义。如果只从单个线程调用第三方组件的方法/属性,那么该组件不必是线程安全的。见文章

此外,我建议您在这种情况下使用一个类


HTH

什么是线程不安全?你的问题似乎与此无关。请您详细说明一下。如果它不是线程安全的,那么它只是意味着它不能一次被多个线程可靠地使用。看起来您运行的是单个后台线程,所以应该可以。您是否遇到了某种错误/竞争条件,导致您对设计进行二次猜测?