如何在里面设置计时器

时间:2014-04-02 09:22:58

标签: c#

我有一个while循环。我想在两种情况下走出这一步:

  1. 我找到了我需要的东西
  2. 我花了10多秒才找到它
  3. 我知道我可以在之前设置日期开始时间并在NowTime -startTime > 10000时检查内部,如下所示:

             DateTime start = DateTime.Now;
                while (Find == false)
                {
                    //code
    
                    if()Find=true;
                     DateTime end = DateTime.Now;
                    if(end-start>10)Find=true;
                }
    

    但我正在寻找一个更优雅的决定。

4 个答案:

答案 0 :(得分:1)

您的代码示例将不起作用,因为如果搜索逻辑(示例中的“// code”部分)执行时间超过10秒,则在完成之前您将无法完成测试。

你应该做的是在一个单独的线程中执行你的操作,并在这个线程上使用超时。

例如:

    public void MyMethod()
    {
        var findThread = new Thread(Find);
        findThread.Start();

        if (!findThread.Join(TimeSpan.FromSeconds(10)))
        {
            findThread.Abort();
            Debug.WriteLine("Find timeout occured");
            // Handle find timeout
        }
    }

    private static void Find()
    {
        //Thread.Sleep(TimeSpan.FromSeconds(5));
        Thread.Sleep(TimeSpan.FromSeconds(20));

        Debug.WriteLine("Find succeeded");
    }

取消注释Thread.Sleep(TimeSpan.FromSeconds(5))行(并注释其他Thread.Sleep),以便在find方法执行时间不到10秒时验证它是否按预期工作。

答案 1 :(得分:0)

使用Stopwatch课程。它具有ElapsedMilliseconds属性,您可以在循环的每次迭代中检查它。

答案 2 :(得分:0)

我不知道你是否正在寻找它,但我会使用System.Diagnostics命名空间中的Stopwatch类:

static class Program
{
    private static readonly Random Rnd = new Random((int)DateTime.UtcNow.Ticks);

    static void Main(string[] args)
    {            
        var stopwatch = new Stopwatch();

        stopwatch.Start();
        bool isFound;
        while (true)
        {
            isFound = Find();

            if (isFound || stopwatch.Elapsed.TotalSeconds >= 10)
                break;
        }

        Console.WriteLine("Is found: {0}, Spent time: {1} sec(s)", isFound, stopwatch.Elapsed.TotalSeconds);
        Console.ReadLine();
    }

    private static bool Find()
    {
        return Rnd.Next(1000) >= 999;
    }
}

答案 3 :(得分:0)

这是很常见的情况,所以我直接从我的代码中提供了这个程序:

public delegate Boolean WaitTestDelegate();
public static Boolean WaitUntil(WaitTestDelegate testDelegate,
    Int32 milliseconds = 10000, Int32 pariodDuration = 10)
{
    DateTime startTime = DateTime.Now; Double timeSpan = 0;
    while (!testDelegate() &&
        (timeSpan = (DateTime.Now - startTime).TotalMilliseconds) < milliseconds)
        Thread.Sleep(pariodDuration);
    return timeSpan < milliseconds;
}

如果循环在时间结束之前完成,则过程将返回true

milliseconds是等待的总时间。

periodDuration是定期调用testDelegate之前等待的时间段。

testDelegate是可以放置测试代码的方法,例如:

() => { return Find; }

最后,从您的代码中调用此过程:

WaitUntil(() => { return Find; });WaitUntil(() => Find);

如果您需要异步等待,请创建线程并将代码运行到线程中,但这是不同的故事。