【问题标题】:timeout for method on UI threadUI线程上的方法超时
【发布时间】:2009-05-04 09:37:00
【问题描述】:

我遇到的问题是我在 UI 线程 (WinForms) 上实例化一个对象。 此对象创建可能需要很长时间,我希望该方法有某种“超时”(因为它阻止了我的应用程序)。

我遇到的问题是: 1.对象必须在UI线程上创建 2.对象是外来对象,我没有任何源访问权限,所以无法修改。

所以我的问题是,如果有人有创意,是否有可能创建一个逻辑来在达到超时时停止执行方法?

tia 马丁

【问题讨论】:

    标签: .net timeout single-threaded


    【解决方案1】:

    这是一个糟糕的解决方案。在计时器上使用工作线程来监视 UI 线程。如果在创建对象之前计时器已过,请让工作线程在 UI 线程上调用 Abort。这将在您必须捕获的 UI 线程中引发 ThreadAbortException。这不好的原因是,您可能会导致程序挂起或崩溃,具体取决于引发异常时的微妙时间和竞争条件。

    “更安全”的方法是让工作人员调用 Interrupt - 这将在 UI 线程中引发 ThreadInterruptedException,但仅当它处于 WaitSleepJoin 状态时 - 如果线程从不休眠,它不会中断,但至少它也不会挂起或损坏内存。

    【讨论】:

      【解决方案2】:

      不是真的; 尤其是如果您无权访问源代码。

      即使可以,在没有充分理由的情况下强行中断代码也不是一个好主意——它只会导致问题(泄漏、锁被锁定等)。

      它必须是 相同 UI 线程吗?您可以生成第二个 UI 线程来拥有此代码吗?它有点杂乱无章,但可以工作。

      【讨论】:

        【解决方案3】:

        如果您使用 BeginInvoke,IAsyncResult 有一个等待句柄,您可以在该句柄上 WaitOne(timeout) - 来自非 UI 线程。

        不幸的是,在超时时,没有干净的方法可以取消 BeginInvoke - 所以您可以尝试1800 INFORMATION 的解决方案。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多