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

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

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

TIA 马丁

有帮助吗?

解决方案

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

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

其他提示

不是真的;如果您无权访问来源,请尤其

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

是否必须是相同的 UI线程?你可以产生第二个UI线程来拥有这个代码吗?它得到了一个 little ,但可以工作。

如果您使用的是BeginInvoke,那么 IAsyncResult 有一个等待句柄,你可以从非UI线程上等待WaitOne(超时)。

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top