如何停止执行弯针?

时间:2020-02-03 08:55:04

标签: c# multithreading

我有一个循环程序线程,该线程始终运行,并从队列中提取任务以执行它们。

有一个主要的循环器方法

public void Start()
        {
            m_looperThread = new Thread(() =>
             {
                 while (true)
                 {
                    //Dequeue use lock inside
                    TASK_TYPE task = m_taskList.GetAndRemoveFirst();

                     if (task == null || !m_isThreadRunning)
                     {
                         break;
                     }

                     task.Execute();
                     FinishedTask(task);
                 }
             }
                )
            {
                IsBackground = true
            };

            m_looperThread.Start();
        }

现在,如果我需要关闭应用程序,则用户需要单击红叉,并且在关闭之前,我需要中止所有循环程序任务。

我怎么做

        public void Abort()
        {
            Put(default(TASK_TYPE));
            m_isThreadRunning = false;

            if (m_looperThread != null)
            {
                m_looperThread.Join();
            }

            m_taskList.Clear();
        }

因此,首先我放置了一个空项目,另外我将m_isThreadRunning的值设置为false,因为在循环程序方法中,我正在检查该值以使其停止。然后,我致电.Join()以确保完成此线程并清除任务列表。现在我完全知道所有任务都已中止,线程已加入并且一切都很好。

但是请在此行

task.Execute();

问题是什么-当任务运行并且用户需要关闭应用程序时,我无法.Join循环程序线程在任务完成工作之前(可能是1分钟)。最后看起来像是应用程序卡住了。

因此,问题是-如何正确.join线程并为用户提供关闭应用程序的机会?

0 个答案:

没有答案