有些方法需要多次运行才能验证。在我的情况下,有bar.Name.Equals("John Doe")
之类的表达式,我想运行并运行,直到此表达式验证。
类似的东西:
bool succeeded = TryUntillOk(bar.Name.Equals("John Doe"), 15, 100);
其中TryUntillOk
是一个运行此表达式15次的方法,每次调用之间的睡眠时间为100毫秒。
我阅读了excellent类似问题的答案列表,但在我的情况下,没有标准代表可以接受此TryUntillOk
方法。
问题的标题不具有建设性。随意编辑它:)
答案 0 :(得分:8)
你可能正在寻找这样的东西:
bool TryRepeatedly(Func<bool> condition, int maxRepeats, TimeSpan repeatInterval)
{
for (var i = 0; i < maxRepeats; ++i)
{
if (condition()) return true;
Thread.Sleep(repeatInterval); // or your choice of waiting mechanism
}
return false;
}
将按以下方式调用:
bool succeeded = TryRepeatedly(() => bar.Name.Equals("John Doe"),
15,
TimeSpan.FromMilliseconds(100));
这里唯一有趣的部分是你将条件指定为Func<bool>
,它是一个不带参数并返回布尔值的方法的委托。 Lambda表达式语法允许您在调用站点上轻松构造此类委托。
答案 1 :(得分:1)
您必须调整调用。 @ Jon的答案有lambda调用,这个版本将comparand与委托
分开using System;
using System.Threading;
namespace test
{
class something
{
public String Name;
}
class Program
{
private delegate bool TryableFunction(String s);
private static bool TryUntillOk(TryableFunction f, String s, int howoften, int sleepms)
{
while (howoften-->0)
{
if (f(s)) return true;
Thread.Sleep(sleepms);
}
return false;
}
static void Main(string[] args)
{
something bar=new something();
bar.Name="Jane Doe";
bool succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100);
Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded);
bar.Name="John Doe";
succeeded = TryUntillOk(bar.Name.Equals,"John Doe", 15, 100);
Console.WriteLine("Succeeded with '{0}': {1}",bar.Name,succeeded);
}
}
}
答案 2 :(得分:0)
你可以检查一下
delegate void d_name(string s);
d_name obj =new d_name(bar.Name.Equals);
bool succeeded = TryUntillOk(obj("John Doe"), 15, 100);
TryUntillOk(obj d,type parameter2,type parameter3 )
{
//do your work
}