在其自己的线程中运行连续进程的最佳方法是什么?

3

我创建了一个应用程序,需要定期使用线程执行一些任务。我不确定这是否是最好的方法,所以如果有人能提出更好的建议,我将不胜感激。

这是我的做法:

以下是包含连续进程函数的类(查找非活动会话和清理空闲项):

public class SessionCleaner
{
    private SQLWorks sqlWorks;
    public SessionCleaner()
    {
        sqlWorks = new SQLWorks();
    }

    private void cleanIdleSessions()
    {
        //this function deletes sessions from database
        sqlWorks.CleanIdleSessions(10);
    }



    //this is an endless loop for executing the cleaning every 5 seconds
    public void DoCleanIdleSessions()
    {
        while(true)
        {
            cleanIdleSessions();
            Thread.Sleep(5000);
        }
    }
}

这是初始化线程的主要表单:

public partial class FormMain : Form
{

...
public FormMain()
    {
        InitializeComponent();
...
        startSessionCleaner();
...
    }

private void startSessionCleaner()
    {
        initializeSessionCleanerThread();
        sessionCleanerThread.Start();
    }

private void initializeSessionCleanerThread()
    {
        sessionCleaner = new SessionCleaner();
        sessionCleanerThread = new Thread(new ThreadStart(sessionCleaner.DoCleanIdleSessions));
    }

private void terminateSessionCleanerThread()
    {
        try
        {
            sessionCleanerThread.Join(1000);
        }
        catch(Exception ex)
        {
            string sDummy = ex.ToString();
        }
    }

private void FormMain_FormClosing(object sender, FormClosingEventArgs e)
    {
        terminateSessionCleanerThread();
    }

谢谢!

2个回答

2
我能看到的最大问题是......为什么它会退出呢?你执行了一个 Join,显然希望它终止,但它只是 while(true)。我会在 SessionCleaner 上创建一个(volatile)布尔字段,在 while 中设置/清除并使用 - 例如:
volatile bool keepRunning = true;

在调用Join退出之前,将其设置为false或类似的值。

我认为保留对sessionCleanerThread的引用没有太大意义(只需在一个方法中初始化并启动它),而吞咽异常可能是个坏主意。


0

terminateSessionCleanerThread()方法显然永远不会返回,正如Marc所指出的那样。除非有我们看不到的东西。

关于使用new Thread()与ThreadPool.QueueUserWorkItem()的问题,有一个相关问题。我猜这个应用程序想要使用QUWI。没有理由不这样做。new Thread()将创建一个前台线程。如果线程终止,这并不重要,但对于这个应用程序来说并不是必要的。

清理是否真的需要每5秒运行一次?似乎只有在服务器高负载下才有意义。但在这种情况下,WinForms应用程序似乎不是完成工作的正确工具。应该是一个记录消息到事件日志等的Windows服务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接