2

機能の使用関数をカプセル化し、それらにパラメーターをC# 4.0追加するための汎用ラッパーが必要です。TimeOut

たとえば、次のような関数があります。

T DoLengthyOperation()

私たちを使用Funcして:

Func<T>

Syncこれは適切であり、関数を(Invloke)またはAsync( )でも呼び出しますBeginInvoke。ここで、TimeOutこの動作に追加されると考えてください。DoLengthyOperation()指定された時間内に戻った場合はtrue戻ってきました。それ以外の場合はfalse

何かのようなもの:

FuncTimeOut<in T1, in T2, ..., out TResult, int timeOut, bool result>
4

3 に答える 3

1

C#ジェネリックタイムアウトを実装する

于 2010-12-19T11:11:11.830 に答える
0

ミキシングする代わりoutbool、リターンをキャプチャするために別のタイプを作成します。例えば

struct Result<T> {
  private bool _isSuccess;
  private T _value;
  public bool IsSucces { get { return _success; } }
  public T Value { get { return _value; } }
  public Result(T value) {
    _value = value;
    _isSuccess = true;
  }
}

これは間違いなく書くことが可能です。唯一の問題は、タイムアウトを実装するには、次のいずれかを実行する必要があることです。

  1. 長時間実行される操作を別のスレッドに移動します。
  2. 長時間実行操作にキャンセルサポートを追加し、別のスレッドからのキャンセルを通知します。
  3. タイムアウトの概念を操作自体に組み込み、操作の多くのポイントで有効期限が切れているかどうかをチェックします。

シナリオについて十分な知識がないため、どちらが最適かを判断するのは困難です。私の本能は、#2または#3に行くことです。プライマリコードでスレッドを切り替える必要がないことは、コードへの影響が最も少ない変更である可能性があります。

于 2010-12-15T18:36:41.777 に答える
0

完全な場合はtrue/falseを返さないでください。例外をスローします。

私はそれを実装する時間がありませんが、それは可能であるはずであり、あなたの基本的な署名は次のようになります:

T DoLengthyOperation<T>(int TimeoutInMilliseconds, Func<T> operation)

また、Func <T>の名前を引数として渡すか、ラムダ式として配置することで、このメソッドを呼び出すことができます。残念ながら、現在、変数番号をジェネリック型の引数として指定する方法がないため、必要なさまざまな種類の関数にオーバーロードを提供する必要があります。

于 2010-12-15T18:17:38.637 に答える