代码之家  ›  专栏  ›  技术社区  ›  Martin Moser

UI线程上的方法超时

  •  1
  • Martin Moser  · 技术社区  · 16 年前

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

    我遇到的问题是: 1。必须在ui线程上创建对象 2。对象是外部对象,我没有任何源访问权限,因此无法修改它。

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

    蒂亚 马丁

    3 回复  |  直到 16 年前
        1
  •  1
  •   1800 INFORMATION    16 年前

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

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

        2
  •  0
  •   Marc Gravell    16 年前

    不是真的; 尤其地 如果你无法访问源代码。

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

    一定是 相同的 UI线程?你可以生成第二个ui线程来拥有这段代码吗?它得到了 小的 好斗,但可以工作。

        3
  •  0
  •   Vlagged    16 年前

    如果您使用BeginInvoke, IAsyncResult 有一个等待句柄,可以从非ui线程等待一个(超时)。

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

    推荐文章