传递一个bool Foo(params [])作为方法参数

有时需要多次运行一个方法直到验证。在我的情况下,有像 bar.Name.Equals(“John Doe”)这样的表达式,我想运行并运行,直到此表达式生效。

就像是:

bool succeeded = TryUntillOk(bar.Name.Equals("John Doe"), 15, 100);

其中 TryUntillOk 是一个方法,在每次调用之间运行此表达式15次,睡眠时间为100ms。

我阅读了这个 excelent 的答案列表类似的问题,但在我的情况下,没有标准委托,这个 TryUntillOk 方法可以接受。

问题的标题并不具有建设性。随意编辑它:)

0
额外 编辑
意见: 1
@GeorgeDuckett是的。对不起,不提。
额外 作者 Odys,
这是否会在单独的线程中运行?否则,价值不会有任何改变的机会。
额外 作者 George Duckett,

3 答案

你必须调整invokation。 @ Jon的答案有lambda invoaction,这个版本将比较与委托分开

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);
        }


    }
}
0
额外
这确实是我的第一次尝试。后来我意识到可能有几种方法可以调用,这意味着我不得不宣布如此多的代表,这是我想避免的。
额外 作者 Odys,
......这正是lambda版本解决的问题!
额外 作者 Eugen Rieck,

你可能正在寻找这样的东西:

bool TryRepeatedly(Func 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));

The only interesting part here is that you specify the condition as a Func, which is a delegate to a method that takes no parameters and returns a boolean. Lambda expression syntax allows you to trivially construct such a delegate at the call site.

0
额外
@GeorgeDuckett抱歉没有提到这一点。所有这些都将在工作线程中完成
额外 作者 Odys,
应该注意的是,这依赖于外部的东西(单独的线程等),导致条件最终评估为真。
额外 作者 George Duckett,

你可以检查它

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
}  
0
额外