【问题标题】:Displaying a "Please Wait" Dialog for a Non-Thread Safe task为非线程安全任务显示“请稍候”对话框
【发布时间】:2009-11-16 19:17:23
【问题描述】:

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

通常我会这样做:

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

【问题讨论】:

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

标签: c# dialog multithreading pleasewait


【解决方案1】:

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

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

HTH

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-12-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多