c# - 启动和停止(强制)线程作业

标签 c# .net multithreading

我想知道启动和停止强制和非强制线程作业的正确方法。这是停止线程的正确方法吗?

    public class ProcessDataJob : IJob
    {
        private ConcurrentQueue<byte[]> _dataQueue = new ConcurrentQueue<byte[]>();
        private volatile bool _stop = false;
        private volatile bool _forceStop = false;
        private Thread _thread;
        private int _timeOut = 1000;

        public void Start()
        {
            _stop = false;
            _forceStop = false;

            _thread = new Thread(ProcessData);
            _thread.Start();
        }

        private void ProcessData()
        {
            while (!_stop || _dataQueue.Count > 0)
            {
                if(_forceStop) return;

                byte[] data;
                if(_dataQueue.TryDequeue(data))
                {
                   //Process data
                   //.....//
                }
            }
        }

        public void Stop(bool force)
        {
            _stop = true;
            _forceStop = force;
            _thread.Join(_timeOut); 
        }

        public void Enqueue(byte[] data)
        {
            _dataQueue.Enqueue(data);
        }
    }

最佳答案

没有正确的方法来强行终止线程。

有几种方法可以做到这一点,但没有一种是正确的

只有当您需要终止程序或卸载包含该线程的应用程序域并且不关心任何处于损坏/错误/锁定状态的悬空数据结构时,才应该强行终止线程,因为他们也会在短时间内消失。

互联网上有很多关于 Thread.Abort 有多糟糕/邪恶的建议,所以不要这样做。

相反,编写适当的协作线程。线程应该自己检查一个标志(事件、volatile bool 字段等),然后在被很好地要求这样做时自愿退出。

这是正确的方式。

关于c# - 启动和停止(强制)线程作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5146186/

相关文章:

c# - Ruby 和 C# 中的方法串联

c# - 同一 EPPlus 工作表的多个自动过滤器

c# - Xamarin forms 单击一次显示上下文菜单

c# - 如何为包含 ManualResetEvent.WaitOne() 的异步(套接字)代码编写单元测试?

java - java main方法的执行创建了多少个线程?

javascript - 提交按钮间歇性地起作用

c# - 请帮助我加快此 LINQ 查询的速度?

.net - Microsoft Orleans 和联合托管客户

java - 锁定类的静态成员

python - 在程序中使用线程时,Systemd 在停止时未收到 SIGTERM