6

有时一个方法需要运行多次直到它被验证。在我的情况下,有一些表达式bar.Name.Equals("John Doe"),我想运行并运行,直到该表达式验证。

就像是:

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

whereTryUntillOk将是一个运行此表达式 15 次的方法,每次调用之间的睡眠时间为 100 毫秒。

我阅读了这个关于类似问题的优秀答案列表,但在我的情况下,没有标准代表TryUntillOk可以接受这种方法。

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

4

3 回答 3

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

这里唯一有趣的部分是您将条件指定为 a Func<bool>,它是一个不带参数并返回布尔值的方法的委托。Lambda 表达式语法允许您在调用站点轻松构造这样的委托。

于 2012-05-24T07:32:37.353 回答
1

您必须调整调用。@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);
        }


    }
}
于 2012-05-24T07:42:59.703 回答
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
}  
于 2012-05-24T07:36:02.593 回答