1

我可以访问一个特定的 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);
            }
        }
    }
4

2 回答 2

1

您可能会看到这种行为,因为您对 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);
                }
        }
    }
于 2013-09-20T03:17:35.000 回答
0

尝试在新线程上执行它

例如

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
}
于 2013-09-20T04:39:43.950 回答