メソッドの実行を停止する

私は、Webサービスから数回情報を取得しようとするクラスを持っています:

public TResult Try(Func<tresult> func, int maxRetries)
{
    TResult returnValue = default(TResult);
    int numTries = 0;
    bool succeeded = false;

    while (numTries < maxRetries)
    {
        try
        {
            returnValue = func();
            succeeded = true;
        }
        catch (Exception ex)
        {
            Log(ex,numTries);
        }
        finally
        {
            numTries++;
        }
        if (succeeded)
        {
            return returnValue;
        }
        else
        {
            if (numTries == maxRetries)
            {
                 //ask user what to do
            }
        }
  }

今度は 'if(numTries == maxRetries)'の後、ユーザーはWebサービスからデータを取得しようとしているのかキャンセルしているのかを選択できます。 上記のメソッドを呼び出したメソッドの実行を中断して実行を停止すると、新しいフォームを開くだけです。このオブジェクトを実行するメソッドが動作し続け、多くの場合問題が発生するため、nullまたは新しいオブジェクトを返すだけではありません。

ですから、基本的には次のようになります:

someValue = retry.Try(() => webService.method(),maxRetries));
//if user canceled after app wasn't able to get data stop execution as already another form is opened

返された値がnullのようなものかどうかはもちろんチェックできます:

someValue = retry.Try(()=>webService.method(),maxRetries));
if (someValue == null) 
return;

しかし、これはコード内で多くの変更を意味し、私はそれを避けたいと思うし、私はそれをTryメソッドからやることができればいいだろう。

1

2 答え

私は2つのことを考えることができます。 TResult が、成功したリクエスト(IsSuccessfulまたはIsValidなど)を表す Boolean フィールドを持つInterfaceタイプであることを確認できます。 TResult を変更できない場合は、tryメソッドで Out パラメータを使用して別の値を渡します。

0
追加された

メソッドの実行を停止する方法はありません。最初に気になることは、例外をスローして呼び出しメソッドからキャッチすることです。

ただし、そのようなフローを制御するために例外を使用すべきではないはずですが、実際に呼び出しメソッドを書き換えることができない場合、これが唯一の選択肢かもしれません。

もう1つのオプションは、返された結果に、呼び出し元に正常に完了したことを通知するためのフラグ(インターフェイス経由)を設定させることです。

0
追加された