【问题标题】: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 的解决方案。