2011-10-27 24 views
1

私は、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 
      } 
     } 
    } 

今後の利用者、彼は継続したい場合は選択したことができるようになります「(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 

私は可能性があり、もちろんチェックの:

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

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

答えて

0

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

0

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

このようなフローを制御するために例外を使用するべきではありませんが、の場合、実際にはは呼び出し元のメソッドを書き換えることができません。

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

関連する問題