【问题标题】:C# WaitFor or Pause for X Seconds Before Next LineC# WaitFor 或在下一行之前暂停 X 秒
【发布时间】:2012-09-12 09:30:10
【问题描述】:

我正在尝试找出执行以下操作的最佳方法? 我有一个与 httpwebrequest 一起使用的控制台应用程序。 在我的应用程序的某些部分,我想这样做:

  agent.GetURL("http://site.com/etc.../"); 
Wait for 8-16 Seconds<-Should be random  
 Agent.GetURL("http://site.com/etc.../");
Wait for 4-6 Seconds etc...

请求对时间敏感,因此计算机时间应该与每个请求不同,我不能只是请求等待它完成并再次请求。我已经阅读了有关计时器 thread.sleep 的信息。恐怕我没有停止或暂停的经验 不想在未来提出问题。那么,如果你能告诉我这种代码的最佳方法是什么?

计时器/thread.sleep 是否可以在函数内部并在我需要时使用它?

谢谢!

编辑:这个程序是不可见的,所以我需要一个不加载圆形鼠标的解决方案:)

【问题讨论】:

    标签: c#


    【解决方案1】:

    试试

    Random random = new Random();
    int timeDelay = random.Next(8, 16);
    
    Thread.Sleep(timeDelay * 1000); //time in milliseconds
    

    【讨论】:

    • 这不会导致冻结?我知道它是否是表单应用程序,但控制台呢?这段代码没有问题,可以安全使用(随着时间的推移可靠吗?)
    • 冻结?不确定您的意思...应用程序将在 timeDelay 期间停止运行。
    • 那么它在等待时不会显示这个圆形鼠标加载图?这就是我的意思:)
    • 如果您希望它在后台运行,您必须将其转移到后台工作线程。 msdn.microsoft.com/en-us/library/cc221403(v=vs.95).aspx
    • 不太确定如何实现 BG Worker,是否像调用函数那样容易,或者我必须拥有 If ... Then... 我仍然想保留我的代码简单干净:)
    【解决方案2】:

    This question 提供了一种在定义范围内生成随机数的方法,您可以按原样将其包装在另一种方法中以暂停随机数秒。

    代码可能如下所示:

    // Method from the linked answer, copy-pasted here for completeness
    // added the relevant fields because the original code is an override
    public Int32 GetNewRandomNumber(Int32 minValue, Int32 maxValue)
    {
        RNGCryptoServiceProvider _rng = new RNGCryptoServiceProvider();
        byte[] _uInt32Buffer = new byte[4];
    
        if (minValue > maxValue) 
            throw new ArgumentOutOfRangeException("minValue");
        if (minValue == maxValue) return minValue;
        Int64 diff = maxValue - minValue;
        while (true)
        {
            _rng.GetBytes(_uint32Buffer);
            UInt32 rand = BitConverter.ToUInt32(_uint32Buffer, 0);
    
            Int64 max = (1 + (Int64)UInt32.MaxValue);
            Int64 remainder = max % diff;
            if (rand < max - remainder)
            {
                return (Int32)(minValue + (rand % diff));
            }
        }
    }
    
    public void RandomWait(int minWait, int maxWait)
    {
        // Thread.Sleep() wants a number of milliseconds to wait
        // We're going, as an example, to wait between 8 and 16 seconds
        System.Threading.Thread.Sleep(GetNewRandomNumber(8, 16) * 1000);
    }
    

    然后,您只需在需要时拨打RandomWait()

    【讨论】:

    • 非常感谢!这看起来不错,快速提问这个随机数代码与常规 r.next(8,17) 不同吗?关于 Thread.Sleep 这不会导致冻结(循环鼠标加载?)并且随着时间的推移它是否可靠?如果是小延迟,也不会太可怕。
    • Thread.Sleep 只是将应用程序停止一段时间(作为控制台应用程序,它似乎会挂起一段时间)。与常规r.Next() 的区别在于,它在随机化方面表现更好。建议的Random() 应用程序将在您每次运行应用程序时产生完全相同的数字序列(您可能希望也可能不希望它,但这是“更随机的”)。
    • 也许我看错了:如果您想要通过鼠标“圆圈”加载光标显示提示,那么这不会:您将不得不拆分跨多个线程的行为。不过我建议不要这样做:控制台应用程序通常不会通过鼠标/Windows GUI 提供反馈。
    • 听起来不错,Alex 非常感谢!我会试试看,让你知道它是怎么回事! :)
    【解决方案3】:

    使用Thread.Sleep(miliseconds) 停止执行所需的时间。

    【讨论】:

    • 完美解决方案:)
    猜你喜欢
    • 2013-11-29
    • 1970-01-01
    • 2018-03-26
    • 2014-03-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-19
    • 2012-12-23
    • 2020-03-16
    相关资源
    最近更新 更多