1

私はC#に比較的慣れていないので、これを手伝ってくれるかもしれません。

callServiceXY(param1, param2, ...)特定のサービスを呼び出すメソッドがいくつかあります。多くの理由で、これらのサービス呼び出しは失敗する可能性があります (そして、私は最終的にその理由をあまり気にしません)。したがって、基本的には、常に次のようなものでラップする必要があります。何か問題が発生した場合に再度実行するためです。

var i = 3;
while(i>0)
  try{
   call...()
  } catch{
   i--;
  }
  i=0;
}

このコードは一度だけ書きたいと思います。どうにかしてtryXtimes(int x, callService())、未定義または匿名のメソッドを実行できるようなメソッドを作成できますか? (私はこれが可能なところで Javascript を念頭に置いています...)?

4

3 に答える 3

2

はい、これは可能です。C# 3.5 では、ActionandFunc<T>型のサポートが追加されました。Action は値を返さず、Func は常に値を返します。

いくつかのパラメーターも受け入れるいくつかの異なるバージョンがあります。次のコンソール アプリケーションは、これを行う方法を説明しています。

using System;

namespace Stackoverflow
{
    class Service
    {
        public int MyMethod() { return 42; }
        public void MyMethod(string param1, bool param2) { }

        public int MyMethod(object paramY) { return 42; }
    }

    class Program
    {
        static void ExecuteWithRetry(Action action)
        {
            try
            {
                action();
            }
            catch
            {
                action();
            }

        }

        static T ExecuteWithRetry<T>(Func<T> function)
        {
            try
            {
                return function();
            }
            catch
            {
                return function();
            }

        }

        static void Main(string[] args)
        { 
            Service s = new Service();
            ExecuteWithRetry(() => s.MyMethod("a", true));

            int a = ExecuteWithRetry(() => s.MyMethod(1));
            int b = ExecuteWithRetry(() => s.MyMethod(true));

        }
    }
}

ご覧のとおり、 には 2 つのオーバーロードがありExecuteWithRetryます。1 つは void を返し、もう 1 つは型を返します。またはExecuteWithRetryを渡して呼び出すことができます。ActionFunc

--> 編集: 素晴らしい! 例を完成させるためのほんの少しの追加コード:

匿名関数/メソッドの場合:

ExecuteWithRetry(() =>
{
   logger.Debug("test");
});

より多くのパラメーター (action、int) を使用

メソッドヘッダー:

public static void ExecuteWithRetryX(Action a, int x)

メソッド呼び出し:

ExecuteWithRetryX(() => { logger.Debug("test"); }, 2);
于 2012-12-29T10:50:31.087 に答える
1

これには戦略/工場パターンを使用します。この回答https://stackoverflow.com/a/13641801/626442は、リンクを使用した戦略/工場パターンの使用例を示しています。上記のリンクの質問は、このパターンを採用できる別のタイプの例を提供します。

ここにはこれらのデザイン パターンの優れた例があり、以下はStrategy パターンFactory パターンの詳細な紹介です。最後の 2 つのリンクの前者は、2 つを組み合わせて必要な処理を行う方法も示しています。

これが役立つことを願っています。

于 2012-12-29T10:51:08.807 に答える
0

フォローしてみてください

    void CallServiceXY(params object []objects)
    {
        Console.WriteLine("a");
        throw new Exception("");
    }

    void Retry(int maxRetryCount, Action<object[]> action, params object[] obj)
    {
        int retryCount = 1;
        while ( retryCount <= maxRetryCount)
        {
            try
            {

            action(obj);
            return;
            }
            catch
            {
                retryCount++;
            }
        }
    }

    void Main()
    {
        Retry(2,CallServiceXY);
        Retry(2,CallServiceXY,"");
        Retry(2,CallServiceXY,"","");

    }

デモはこちら

トリックは、オブジェクト配列を受け入れ、Retry メソッドでAction<object[]>void とparamsキーワードを返すことです。
非 void 値を返すには、 に変更Action<object[]>Func<T, object[]>ます。

于 2012-12-29T11:15:05.467 に答える