2009-03-28 5 views
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

私が見ることができる最大の問題は...なぜそれが終了するのでしょうか? Joinを実行すると、明らかに終了すると予想されますが、ちょうどwhile(true)です。

volatile bool keepRunning = true; 

または類似(終了しJoinを呼び出す前にfalseに設定):例えば - 私は、設定/ whileにクリアされ、使用されます(SessionCleaner上の)どこか(揮発性)ブールフィールドを持っているでしょう。

sessionCleanerThread(1つの方法で初期化して起動してください)の参照を維持することに多くの点がありません。例外の嚥下はおそらく悪い考えです。

0

Marcが指摘したように、terminateSessionCleanerThread()メソッドは決して返されません。もし私たちが見ることができないものがなければ。

新しいスレッド()とThreadPool.QueueUserWorkItem()の使用に関するrelated questionがあります。私の推測では、このアプリケーションはQUWIを使いたいと思っています。そうしない理由はありません。 new Thread()はフォアグラウンドスレッドを作成します。スレッドが終了するかどうかは関係ありませんが、このアプリケーションでは必要ありません。

5秒ごとにクリーニングを実行する必要がありますか?負荷が高い状態でサーバ上で意味をなさないように見えます。しかしその場合、WinFormsアプリケーションは仕事のための間違ったツールのように思えます。イベントログなどにメッセージを記録するWindowsサービスである必要があります。

関連する問題