我正在编写一个函数,该函数接收要满足的条件并超时,并在满足条件或超时时结束。
这是我到目前为止所拥有的:
public static bool CheckWithTimeout(bool toBeChecked, int msToWait)
{
//var src = CancellationSource
var task = Task.Run(()=> {
while (!toBeChecked)
{
System.Threading.Thread.Sleep(25);
}
});
if (task.Wait(TimeSpan.FromMilliseconds(msToWait)))
return toBeChecked;
else
return false;
}
它对于简单的布尔效果很好,但我想这样称呼:
CheckWithTimeout(myValue > 10, 500)
并且它将在myValue大于10或经过500 ms时返回(在这种情况下返回false)
我检查了一下,我认为Func是我所需要的,但是..我找不到合适的例子。 此外,如果已经有实现此目的的方法,我肯定会喜欢它。
答案 0 :(得分:2)
如果使用简单的bool
参数,则在调用该方法时将仅对其评估一次。如果要多次执行评估,则需要使用Func<bool>
:
public static bool CheckWithTimeout(Func<bool> toBeChecked, int msToWait)
{
//var src = CancellationSource
var task = Task.Run(()=> {
while (!toBeChecked())
{
System.Threading.Thread.Sleep(25);
}
});
if (task.Wait(TimeSpan.FromMilliseconds(msToWait)))
return toBeChecked();
else
return false;
}
现在您可以使用lambda调用该方法:
CheckWithTimeout(() => myValue > 10, 500)
或者只是创建一个返回bool
并将其名称传入的方法。
答案 1 :(得分:2)
最好将单独的任务用于结果和等待。
B
这样,您就不必等待超时。 (而且Taks.Delay比Task.Wait更好,因为它不会阻塞)
编辑:带有函数或谓词的示例