在我的控制台应用程序中,我有一些线程,每个线程都有一个无限循环,有一个Thread.Sleep.有许多线程,因为每个线程都是独立于其他线程的,每个循环都是每 waitingTime
时间,我想,永远不会停止。
static int waitingTime= 5 * 60 * 1000;
static void Main(string[] args)
{
Thread thread1 = new Thread(() => Thread1());
Thread thread2 = new Thread(() => Thread2());
Thread thread3 = new Thread(() => Thread3());
...
thread1.Start();
thread2.Start();
thread3.Start();
...
}
static void Thread1()
{
do
{
// Connect to DB and do something...
try
{
using (SqlConnection connection = MyDBClass.MyDBConnection())
{
connection.Open();
SqlCommand command = connection.CreateCommand();
command.CommandText = "SELECT x, y FROM Table WITH (NOLOCK);";
SqlDataReader sdr = command.ExecuteReader();
while (sdr.Read())
{
MyObject obj = new MyObject(sdr[0] as string, ...);
MyStaticClass.SetMyObject(obj); // Open a new DB connection on different server and do an Update.
}
sdr.Close();
sdr.Dispose();
}
}
catch
{
}
Thread.Sleep(waitingTime);
}
while (true);
}
static void Thread2()
{
do
{
// Connect to DB and do something...
Thread.Sleep(waitingTime);
}
while (true);
}
...
我读到,在这样的情况下,使用Thread.Sleep()并不是很好,应该使用这样的解决方案。EventWaitHandle.这种情况下最好的解决方案是什么,如何实现。
一个线程的睡眠与 Thread.Sleep()
消耗的CPU资源为零,所以试图用 EventWaitHandle
基元或其他手段是没有意义的。你无法战胜零。你可以改善的是线程所消耗的RAM,这就是 1 MB 的堆栈,再加上他们在堆上分配的内存(这取决于他们在工作时做什么)。因此,通过使用一个线程而不是三个线程,你可以减少2 MB或更多的内存消耗,这对于一个在现代PC上运行的控制台应用程序来说几乎不算什么。所以在你那里我不会担心这个问题。