如何每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);
}
}
考虑到这是一个控制台应用程序,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
作为逻辑变得相当丑陋,非常快。