【发布时间】:2020-09-16 20:27:30
【问题描述】:
在我的控制台应用程序中,我有一些线程,每个线程都有一个带有 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?为什么你认为EventWaitHandle会帮助你?请详细说明。 -
您是否使用多线程来提高性能?数据库访问最好通过异步而不是并行来解决。
-
使用计时器并研究异步编程。创建线程然后让它们休眠是浪费资源......
-
@dymanoid
Thread.Sleep是让循环停止等待时间。使用EventWaitHandle或AutoResetEvent可以释放CPU使用率吗? -
@JohnathanBarclay 我使用多个线程来允许 Thread1()、Thread2() ... 代码独立于其他人运行。你能告诉我最好的方法是什么吗?
标签: c# multithreading timer console-application