我有一个循环程序线程,该线程始终运行,并从队列中提取任务以执行它们。
有一个主要的循环器方法
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
线程并为用户提供关闭应用程序的机会?