检查谓词的 C# 函数
C# function that checks predicate
我正在编写一个函数,该函数接收要满足的条件和超时,并在满足条件或超时时结束。
这是我目前所拥有的:
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 毫秒时,它会 return(在这种情况下 returns 为 false)
我检查了一下,我认为 Func 是我需要的,但是..我找不到合适的例子。
此外,如果已经存在实现此目的的方法,我肯定会更喜欢它。
如果您使用简单的 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)
或者只是创建一个 returns 一个 bool
的方法并传入它的名字。
结果和等待最好使用不同的任务。
private async Task<bool> CheckWithTimeout(Func<bool> toBeChecked, int msToWait)
{
var waitTask = Task.Delay(msToWait);
var checkTask = Task.Run(toBeChecked);
await Task.WhenAny(waitTask, checkTask);
return checkTask.IsCompleted && await checkTask;
}
private async Task<bool> CheckWithTimeout<T>(Predicate<T> toBeChecked, T predicateParameter, int msToWait)
{
var waitTask = Task.Delay(msToWait);
var checkTask = Task.Run(() => toBeChecked(predicateParameter));
await Task.WhenAny(waitTask, checkTask);
return checkTask.IsCompleted && await checkTask;
}
这样你就不必等待超时了。
(而且 Taks.Delay 比 Task.Wait 好,因为它不会阻塞)
编辑:带有函数或谓词的示例
我正在编写一个函数,该函数接收要满足的条件和超时,并在满足条件或超时时结束。
这是我目前所拥有的:
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 毫秒时,它会 return(在这种情况下 returns 为 false)
我检查了一下,我认为 Func 是我需要的,但是..我找不到合适的例子。 此外,如果已经存在实现此目的的方法,我肯定会更喜欢它。
如果您使用简单的 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)
或者只是创建一个 returns 一个 bool
的方法并传入它的名字。
结果和等待最好使用不同的任务。
private async Task<bool> CheckWithTimeout(Func<bool> toBeChecked, int msToWait)
{
var waitTask = Task.Delay(msToWait);
var checkTask = Task.Run(toBeChecked);
await Task.WhenAny(waitTask, checkTask);
return checkTask.IsCompleted && await checkTask;
}
private async Task<bool> CheckWithTimeout<T>(Predicate<T> toBeChecked, T predicateParameter, int msToWait)
{
var waitTask = Task.Delay(msToWait);
var checkTask = Task.Run(() => toBeChecked(predicateParameter));
await Task.WhenAny(waitTask, checkTask);
return checkTask.IsCompleted && await checkTask;
}
这样你就不必等待超时了。 (而且 Taks.Delay 比 Task.Wait 好,因为它不会阻塞)
编辑:带有函数或谓词的示例