6

メソッドが検証されるまで、メソッドを数回実行する必要がある場合があります。私の場合、bar.Name.Equals("John Doe")この式が検証されるまで実行して実行したい式があります。

何かのようなもの:

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

whereTryUntillOkは、各呼び出しの間に 100 ミリ秒のスリープを入れて、この式を 15 回実行するメソッドになります。

同様の問題に対するこの優れた回答のリストを読みましたが、私の場合、この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));

ここで唯一興味深いのは、条件を として指定することですFunc<bool>。これは、パラメーターをとらず、ブール値を返すメソッドへのデリゲートです。ラムダ式の構文を使用すると、呼び出しサイトでそのようなデリゲートを簡単に構築できます。

于 2012-05-24T07:32:37.353 に答える
1

呼び出しを調整する必要があります。@Jonの答えにはラムダ呼び出しがあり、このバージョンは比較対象をデリゲートから分離します

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 に答える