gpt4 book ai didi

c# - 从另一个线程停止线程

转载 作者:行者123 更新时间:2023-11-30 14:07:46 25 4
gpt4 key购买 nike

我在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com