我有一个while
循环。我想在两种情况下走出这一步:
我知道我可以在之前设置日期开始时间并在NowTime -startTime > 10000
时检查内部,如下所示:
DateTime start = DateTime.Now;
while (Find == false)
{
//code
if()Find=true;
DateTime end = DateTime.Now;
if(end-start>10)Find=true;
}
但我正在寻找一个更优雅的决定。
答案 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);
如果您需要异步等待,请创建线程并将代码运行到线程中,但这是不同的故事。