我在 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
。
此外,如果您想创建一些工作项目,应该由线程一次性处理,而不是提供这些(也是不可变的)工作项目的不可变列表(例如数组)。然后线程本身可以创建一个结果列表,它在工作完成后返回。也许您应该看看生产者消费者模式。
使用从不同线程操作的共享状态总是会导致难以调试的问题。不变性是您的 friend 。
举个例子,Roslyn 编译器在内部一直使用不可变对象(immutable对象)和 immutable collections只是为了消除大多数发生的竞争条件。
关于c# - 从另一个线程停止线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38369500/