C# - Thread.Sleep() 似乎在我的 Windows 服务中不起作用
本文关键字:我的 Windows 服务 不起作用 Thread Sleep | 更新日期: 2023-09-27 18:32:00
我可以访问一个特定的 API,该 API 强制执行每秒约 3 次 API 调用的速度限制。 我正在使用 C# 创建一个 Windows 服务,我想如果我只是在调用之间放置一个"Thread.Sleep(4000)
",那每次调用都会延迟 4 秒。 好吧,我有一个" for
"循环,循环 10 次,用于测试。 在一秒钟左右的时间内,它将从 API 中提取的所有 10 条记录插入到我的数据库中。 所以,Thread.Sleep(4000)
没有得到遵守。 我读过Thread.Sleep()
仅适用于当前线程。 我对线程了解不多,但我希望你们中的一个人能告诉我我做错了什么,或者至少建议一种遵守 API 流量法规的替代方法。 这是我代码的相关部分:
using (SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=*****;Integrated Security=true;"))
{
for (int i = 0; i < 10; i++)
{
movie = api.GetMovieInfo(i);
Thread.Sleep(4000);
if (string.IsNullOrEmpty(movie.title))
continue;
string queryString = string.Format("insert into movie values ('{0}')", movie.title);
SqlCommand command = new SqlCommand(queryString, connection);
try
{
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
您可能看到此行为,因为您对 Thread.Sleep 的调用发生在 using 语句中。虽然我仍然希望它至少需要四秒钟,而你说在一秒钟内插入了所有 10 条记录。您可以尝试从 using 语句中删除对 Thread.Sleep 的调用,以查看行为是否得到改善...
请参阅: C# 退出 using() 块,其中线程仍在作用域对象上运行
我确实认为Threading.Timer 是一个更好的选择,但我也认为 Thread.Sleep 也应该工作:
for (int i = 0; i < 10; i++)
{
DoAPIWork();
Thread.Sleep(4000);
}
private void DoAPIWork()
{
using (SqlConnection connection = new SqlConnection("Data Source=localhost;Initial Catalog=*****;Integrated Security=true;"))
{
movie = api.GetMovieInfo(i);
if (string.IsNullOrEmpty(movie.title))
continue;
string queryString = string.Format("insert into movie values ('{0}')", movie.title);
SqlCommand command = new SqlCommand(queryString, connection);
try
{
connection.Open();
command.ExecuteNonQuery();
connection.Close();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
}
}
尝试在新线程上执行它
例如
for(int i = 0; i < 10; i++)
{
Thread executionThread = new Thread(() =>
{
//Call your api process here
DoWork();
});
executionThread.Start();
// This stops the current thread and wait for the executionThread
executionThread.Join();
}
and then let your DoWork() handle the sleep.
public void DoWork()
{
Thread.Sleep(4000);
// Do actual work here
}