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

标签 c# multithreading

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

相关文章:

c# - 从dB C#返回相关数据

C# Hue Bridge PUT 发送 OK 响应。无 API 响应

c# - 如何为枚举类型参数创建扩展方法?

c# - 如何仅使用动态将 JSON 反序列化为简单的 Dictionary<string,object> 到 datagridview?

c# - asp.net ffmpeg 视频编码挂起

java - 多线程服务器随机抛出java.net.SocketTimeoutException : Read timed out

c# - 下载按钮不显示

java - Java Robot 类是否在自己的线程中运行?

C# 多源、不同线程、一个事件处理程序

c# - 在不使用 C# 和线程打开图像的情况下获取 Jpg 宽度和高度的最快方法