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

时间:2009-03-28 23:08:18

标签: .net multithreading

我创建了一个应用程序,它必须使用线程定期执行某些任务。我不确定这是否是最佳方式,所以如果有人能提出更好的方法,我真的很感激。

这就是我这样做的方式:

这是包含连续过程功能的类(查找非活动会话和清理空闲项目):

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 个答案:

答案 0 :(得分:2)

我能看到的最大问题是......为什么会退出?你做Join,所以显然希望它终止,但只是while(true)。我会在某个地方(SessionCleaner)有一个(volatile)bool字段,它被设置/清除并在while中使用 - 例如:

volatile bool keepRunning = true;

或类似(在调用false退出之前将其设置为Join。)

我也没有注意到保持对sessionCleanerThread的引用(只是在一个方法中初始化并启动它),吞咽异常可能是一个坏主意。

答案 1 :(得分:0)

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

关于使用新的Thread()与ThreadPool.QueueUserWorkItem()有一个related question。在我的猜测中,我认为这个应用程序想要使用QUWI。没有理由不这样做。 new Thread()将创建一个前台线程。如果线程终止则无关紧要,但这个应用程序没有必要。

清洁真的需要每5秒运行一次吗?似乎在高负载下在服务器上有意义。但在这种情况下,WinForms应用程序似乎是错误的工具。应该是将消息记录到事件日志等的Windows服务