我创建了一个应用程序,它必须使用线程定期执行某些任务。我不确定这是否是最佳方式,所以如果有人能提出更好的方法,我真的很感激。
这就是我这样做的方式:
这是包含连续过程功能的类(查找非活动会话和清理空闲项目):
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();
}
谢谢!
答案 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服务