我有一个问题,我在 UI 线程(WinForms)上实例化一个对象。这个对象创建可能需要很长时间,我希望该方法有某种“超时”(因为它阻止了我的应用程序)。
我遇到的问题是:1.对象必须在UI线程上创建2.对象是外来对象,我没有任何源访问权限,所以无法修改。
所以我的问题是,如果有人有创意,是否可以创建一个逻辑,如果达到超时,则停止执行该方法?
蒂亚·马丁
我有一个问题,我在 UI 线程(WinForms)上实例化一个对象。这个对象创建可能需要很长时间,我希望该方法有某种“超时”(因为它阻止了我的应用程序)。
我遇到的问题是:1.对象必须在UI线程上创建2.对象是外来对象,我没有任何源访问权限,所以无法修改。
所以我的问题是,如果有人有创意,是否可以创建一个逻辑,如果达到超时,则停止执行该方法?
蒂亚·马丁
这是一个糟糕的解决方案。在计时器上使用工作线程来监视 UI 线程。如果在创建对象之前计时器已过,则让工作线程调用Abort
UI 线程。这将ThreadAbortException
在您必须捕获的 UI 线程中引发一个。这不好的原因是因为您可能会导致程序挂起或崩溃,具体取决于引发异常的微妙时间和竞争条件。
“更安全”的方法是让工作人员调用Interrupt
- 这将ThreadInterruptedException
在 UI 线程中引发 a,但仅当它处于WaitSleepJoin
状态时 - 如果线程从不休眠,它不会中断,但至少不会挂起或损坏内存也。
并不真地; 特别是如果您无权访问源代码。
即使可以,在没有充分理由的情况下强行中断代码也不是一个好主意——它只会导致问题(泄漏、锁被锁定等)。
它必须是相同的UI 线程吗?您可以生成第二个 UI 线程来拥有此代码吗?它有点杂乱无章,但可以工作。
如果您使用 BeginInvoke,则IAsyncResult有一个等待句柄,您可以在该句柄上 WaitOne(timeout) - 来自非 UI 线程。
不幸的是,在超时时,没有干净的方法可以取消 BeginInvoke - 所以你可以尝试1800 INFORMATION
's 解决方案。