Каков наилучший способ запустить непрерывный процесс в своем собственном потоке? - PullRequest
3 голосов
/ 29 марта 2009

Я создал приложение, которое периодически выполняет некоторые задачи, используя потоки. Я не уверен, что это лучший способ сделать это, поэтому я был бы очень признателен, если бы кто-нибудь мог предложить лучший способ.

Вот как я это сделал:

Это класс, который включает функции для непрерывного процесса (поиск неактивных сеансов и очистка пустых элементов):

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 голосов
/ 29 марта 2009

Самая большая проблема, которую я вижу, это ... с чего бы это когда-нибудь выходило? Вы делаете Join, поэтому, очевидно, ожидаете, что он закончится, но это просто while(true). У меня было бы (volatile) поле bool где-нибудь (на SessionCleaner), которое устанавливается / очищается и используется в while - например:

volatile bool keepRunning = true;

или аналогичный (установите значение false перед вызовом Join для выхода).

Я также не вижу особого смысла в сохранении ссылки на sessionCleanerThread (просто инициализируйте и запускайте ее одним способом), и проглатывание исключения, вероятно, является плохой идеей.

0 голосов
/ 29 марта 2009

Метод terminateSessionCleanerThread () никогда не вернется, по-видимому, как отметил Марк. Если нет чего-то, что мы не можем видеть.

Есть связанный вопрос относительно использования нового Thread () по сравнению с ThreadPool.QueueUserWorkItem (). Я думаю, что это приложение хочет использовать QUWI. Нет причин не делать этого. new Thread () создаст поток переднего плана. Это не имеет значения, если поток завершается, но это не обязательно для этого приложения.

Нужно ли чистить каждые 5 секунд? Похоже, это имело бы смысл на сервере под высокой нагрузкой. Но в этом случае приложение WinForms кажется неподходящим инструментом для работы. Должна быть служба Windows, которая записывает сообщения в журнал событий и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...