【发布时间】:2015-02-16 16:02:47
【问题描述】:
我目前正在使用线程在控制台应用程序中每秒运行一个函数 C# 是线程的最佳方式吗?正如我问过很多朋友一样,他们建议使用计时器而不是线程来每秒运行一些东西?如果使用计时器是一个更好的选择,我将如何使用计时器每秒运行一个函数?我环顾四周,但我真的不确定这是否适用,以及它是否以我自己的方式处理它的正确方式。那么有人可以告诉我答案以及我该怎么做吗?
那么每秒运行它的最佳方式是什么?在你回答之前,让我让你知道这是每秒运行 2 天...... 我当前的线程编码
namespace Reality.Game.Misc
{
using Reality;
using Reality.Communication.Outgoing;
using Reality.Game.Rooms;
using Reality.Game.Sessions;
using Reality.Storage;
using System;
using System.Data;
using System.Threading;
public static class JobCacheWorker
{
private static Thread jWorkerThread;
public static void HandleExpiration(Session Session)
{
using (SqlDatabaseClient client = SqlDatabaseManager.GetClient())
{
Session.CharacterInfo.UpdateWorking(client, 0);
}
}
public static void Initialize()
{
jWorkerThread = new Thread(new ThreadStart(JobCacheWorker.ProcessThread));
jWorkerThread.Priority = ThreadPriority.Highest;
jWorkerThread.Name = "JobCacheWorker";
jWorkerThread.Start();
}
public static void CheckEffectExpiry(Session Session)
{
try
{
//RunMyCodeHere...
}
catch (Exception exception)
{
Console.WriteLine("Exception - JobCacheWorker -> " + exception.Message);
}
}
private static void ProcessThread()
{
while (Program.Alive)
{
try
{
foreach (Session Session in SessionManager.Sessions.Values)
{
if (Session != null && Session.Authenticated && !Session.Stopped)
{
CheckEffectExpiry(Session);
Thread.Sleep(1000);
}
}
}
catch (ThreadAbortException exception)
{
Output.WriteLine("ThreadAbortException - JobCacheWorker -> " + exception.Message);
}
catch (ThreadInterruptedException exception2)
{
Output.WriteLine("ThreadInterruptedException - JobCacheWorker -> " + exception2.Message);
}
}
}
}
}
【问题讨论】:
-
要考虑的主要事情是您当前的代码实际上并不是每秒都运行。如果
CheckEffectExpiry需要半秒,那么您将每 1.5 秒运行一次(进程半秒,然后休眠 1 秒,然后重复)。计时器可以让您每秒运行一个方法,但是您需要确保如果前一个仍在运行,您不会开始堆叠同时运行的多个方法(假设这是您不想)。您可能想澄清“每一秒”中精确度的重要性。 -
在这种情况下,由于 1 秒的小延迟,睡眠比定时器更安全。
-
视情况而定。如果您当前的方法有效,那么您忘记说明为什么它足够好 无效。另请注意:
Thread.Sleep不包括函数本身执行所花费的时间,而Timer将为您提供连续准确的事件。准确性值得商榷,但Thread.Sleep在 1000 次迭代后会增加(累积)不准确性,而Timer不会。 -
几天后我的线程崩溃并停止工作。这正常吗?
-
是的,如果它崩溃了,那么它可能是由于您的代码中的一些错误。坠机的性质是什么?
标签: c# multithreading timer