如何每200毫秒完成一次任务

本文关键字:一次 任务 何每 200毫 | 更新日期: 2023-09-27 18:02:26

我需要在for循环中向web服务器发布ie 25个请求。由于某些原因,web服务器被限制为每秒只有5个调用。所以我需要确保从上次请求到现在已经经过了200毫秒。我有下面的代码作为演示(实际的代码是在一个WCF服务),但我相信线程。睡觉并不是最好的方法。有别的选择吗,有头的还是没有头的?

class Program
{
    private static long lastRun = DateTime.Now.Ticks;
    static void Main(string[] args)
    {
        for (int i = 0; i < 25; i++) { PostData(); }
        Console.WriteLine("Hit any key...");
        Console.ReadLine();
    }
    static void PostData()
    {
        var elapsedMilliseconds = (int)TimeSpan.FromTicks(DateTime.Now.Ticks - lastRun).TotalMillliseconds;
        if (elapsedMilliseconds < 200)
        {
            var pause = 200 - elapsedMilliseconds;
            Console.WriteLine("Pausing for " + pause);
            // pause
            Thread.Sleep(pause);
        }
// HttpPost here
        lastRun = DateTime.Now.Ticks;
        Console.WriteLine("Job done at {0}.{1}", DateTime.Now, DateTime.Now.Millisecond);
    }
}

如何每200毫秒完成一次任务

考虑到这是一个控制台应用程序,Thread.Sleep()实际上会工作得很好。它会阻塞,但在阻塞期间确实没有任何其他工作要做,所以它的缺点很小。

如果这是一个GUI应用程序、服务或其他阻塞不好的场景,那么我建议使用异步方法,而不是await Task.Delay(pause),这将允许UI继续处理消息。但是,这在控制台应用程序中并不重要,因此您当前的方法几乎没有缺点。

这将涉及到使你的主方法异步

static async Task PostDataMultipleTimes(int times)
{
     for (int i=0;i<times;++i)
     {
         var sw = Stopwatch.StartNew();
         PostData(); // PostData doesn't need to sleep/wait/etc anymore
         var ms = (int)sw.ElapsedMilliseconds;
         if (ms < 200)
             await Task.Delay(200 - ms);
     }
}

注意PostData不再需要任何与阻塞相关的逻辑-它只会发布您的相关数据。

这很可能在。net 4中实现。与任务延续,但我可能只使用Sleep作为逻辑变得相当丑陋,非常快。