C# 从其他线程停止线程
我在C#中使用多线程时有点困难 我只需激活线程: 内螺纹: 为了从主线程停止线程,我使用: 问题是,有时(并非总是)我的程序会在线停止: 有人知道是什么导致了这一错误的发生吗 致以最良好的祝愿,C# 从其他线程停止线程,c#,multithreading,C#,Multithreading,我在C#中使用多线程时有点困难 我只需激活线程: 内螺纹: 为了从主线程停止线程,我使用: 问题是,有时(并非总是)我的程序会在线停止: 有人知道是什么导致了这一错误的发生吗 致以最良好的祝愿, 克里斯很可能是因为比赛条件而失败。我假设receivingmultiple在线程启动之前没有初始化,因此它默认为false 因此,当您执行以下操作时: while (Globals.PIC.recievingMultiple); …它有可能是false,因此while被完全跳过 使用AutoRes
克里斯很可能是因为比赛条件而失败。我假设
receivingmultiple
在线程启动之前没有初始化,因此它默认为false
因此,当您执行以下操作时:
while (Globals.PIC.recievingMultiple);
…它有可能是false
,因此while
被完全跳过
使用AutoResetEvent
<代码>手动重置事件或至少联锁。比较交换
<代码>联锁。读取比普通变量更安全
生成一个线程只是为了立即阻止它来完成某种程度上的任务,这违背了线程的目的。您应该真正避免
thread.Abort()
。如果给定给线程的方法退出,该线程将自动关闭。因此,在线程中,只需删除中止调用并保留该方法。如果需要预先退出线程并希望通知它这样做,请使用CancellationToken
另外,如果您希望创建一些工作项,这些工作项应该由线程一次性处理,那么可以提供这些(也是不可变的)工作项的不可变列表(例如数组)。然后,线程本身可以创建一个结果列表,并在工作完成后返回。也许你们应该看看生产者-消费者模式
使用将从不同线程操作的共享状态总是导致难以调试的问题。不变性是你的朋友
举个例子,Roslyn编译器内部一直使用不可变对象,只是为了消除大多数出现的争用条件。有趣的代码格式,我喜欢:)是
Globals.PIC.receivingMultiple
声明的volatile
?为什么要从内部中止readThread?只需在readmultiplevarfortextboxs
中使用return
。对代码进行一些注释。在多线程代码共享中,状态是bug的主要来源。静力学不是你想象中的朋友。另外,您不需要在线程内中止自己:Globals.readThread.abort()代码>,理想情况下,您不需要在任何地方使用中止
,只需停止执行代码,即退出循环即可。
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);
while (Globals.PIC.recievingMultiple);