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