![]() |
1
1
其他的帖子可能正在讨论原因。 我喜欢使用 WaitHandles 当我试图杀死一个线程时,与thread.join()/thread.abort()一起使用。
不过,最好也能解决最初的死锁问题。 |
![]() |
2
4
我们将假设后者;一些常见的原因:
你能缩小范围吗?也许可以插入一些代码来跟踪线程的工作间隔,并确保它在做一些有用的事情——或者,如果没有,跟踪它被卡住的地方。 |
![]() |
3
2
application.doEvents是一种允许处理消息泵中挂起事件的方法。通常应该与您的后台线程完全无关。 如果取消“根本不起作用”,解决方案将主要取决于“根本不起作用”的含义。您是否无法更改标志?用户界面卡住了吗?后台线程是否不响应标志chane?这是别的东西吗?解决方案主要取决于问题的具体内容。可能是您没有从后台检查标志,也可能是死锁了两个线程。显示代码或详细描述问题细节将有帮助。 |
![]() |
4
2
这几乎总是很容易调试的。当您看到工作线程忽略取消请求时,请使用debug+break all。然后调试+windows+线程并双击工作线程。然后查看调用堆栈,了解线程在做什么,以及为什么它不通过检查标志的代码。 注意,必须用volatile关键字声明标志成员。这将阻止JIT编译器生成将成员值加载到寄存器中并且从不检查内存中实际变量值的机器代码。在没有调试器的情况下运行程序的发布版本时,很容易发生这种情况。在这种情况下,在使用break all命令之前,请确保使用tools+attach to process附加调试器。 通过waitone(0)调用检查的manualResetevent更好。 |
![]() |
Emopusta · 从后端到前端的图像路径不工作 2 年前 |
![]() |
Asdrubal Hernandez · Linq查询特定数组索引出错 2 年前 |
![]() |
Niyazi Babayev · 如何在表达式中动态应用表达式? 2 年前 |
|
Dansih · .Net核心自定义身份验证方案 2 年前 |
![]() |
lolorekkk · 面板插入。NET WinForm 2 年前 |