[英]Stop thread from other thread
我在C#中使用多线程有点困难。
我只是激活线程:
getMultiVarEnabled = true; Globals.readThread = new Thread(readMultipleVarForTextBoxes); Globals.readThread.IsBackground = true; Globals.readThread.Start();
内线程:
Globals.PIC.recievingMultiple = true; while (getMultiVarEnabled) // dodaj timeout { ... } Globals.PIC.recievingMultiple = false; Globals.readThread.Abort();
并从我使用的主线程停止线程:
if (getMultiVarEnabled) { getMultiVarEnabled = false; while (Globals.PIC.recievingMultiple); Globals.readThread.Join(); Globals.readThread = null; }
问题是有时(并非总是)我的程序停止在线:
while (Globals.PIC.recievingMultiple);
有谁知道是什么让这个错误发生?
最好的问候,克里斯
你应该真的避免使用Thread.Abort()
。 如果给出一个线程的方法退出,线程将自动关闭。 所以在你的线程中只需删除中止调用并离开方法。 如果你需要预先退出线程并喜欢通知它这样做,那么使用CancellationToken
。
此外,如果您想创建一些工作项,这应该由一个线程中的一个线程处理,而不是提供这些(也是不可变的)工作项的不可变列表(例如,数组)。 然后,线程本身可以创建在工作完成后返回的结果列表。 也许你应该看一下生产者消费模式 。
使用将从不同线程操纵的共享状态总是导致难以调试的问题。 不变性是你的朋友。
仅举一个例子,Roslyn编译器内部使用所有不可变对象和不可变集合来消除大多数出现的竞争条件。
它很可能是由于竞争条件而失败。 我假设在线程启动之前没有初始化recievingMultiple
因此它默认为false
。
因此,当您执行以下操作时:
while (Globals.PIC.recievingMultiple);
...有一个机会,它是false
,并因此while
被完全忽略。
使用AutoResetEvent
; ManualResetEvent
或至少Interlocked.CompareExchange
; Interlocked.Read
比纯变量更安全。
产生一个线程只是为了立即阻止它完成那种打败线程的目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.