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);
            }
        }
    }

C# - Thread.Sleep() 似乎在我的 Windows 服务中不起作用

您可能看到此行为,因为您对 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
}