Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从其他线程停止线程_C#_Multithreading - Fatal编程技术网

C# 从其他线程停止线程

C# 从其他线程停止线程,c#,multithreading,C#,Multithreading,我在C#中使用多线程时有点困难 我只需激活线程: 内螺纹: 为了从主线程停止线程,我使用: 问题是,有时(并非总是)我的程序会在线停止: 有人知道是什么导致了这一错误的发生吗 致以最良好的祝愿, 克里斯很可能是因为比赛条件而失败。我假设receivingmultiple在线程启动之前没有初始化,因此它默认为false 因此,当您执行以下操作时: while (Globals.PIC.recievingMultiple); …它有可能是false,因此while被完全跳过 使用AutoRes

我在C#中使用多线程时有点困难

我只需激活线程:

内螺纹:

为了从主线程停止线程,我使用:

问题是,有时(并非总是)我的程序会在线停止:

有人知道是什么导致了这一错误的发生吗

致以最良好的祝愿,
克里斯

很可能是因为比赛条件而失败。我假设
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);