Добавить параметр «TimeOut» в «Func <>» в C # 4.0 - PullRequest
2 голосов
/ 15 декабря 2010

Использование 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>

Ответы [ 3 ]

1 голос
/ 19 декабря 2010
0 голосов
/ 15 декабря 2010

Вместо смешивания out и bool я бы вместо этого построил отдельный тип для захвата возврата.Например

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.Если основной код не должен переключать потоки, это, вероятно, наименее значимое изменение в вашем коде.

0 голосов
/ 15 декабря 2010

Не возвращайте true / false для завершения. Брось исключение.

У меня нет времени на его реализацию, но это должно быть возможно, и ваша основная подпись будет выглядеть так:

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

И вы можете вызвать этот метод, передав имя любого Func в качестве аргумента или определив его как лямбда-выражение. К сожалению, вам также потребуется обеспечить перегрузку для функций другого типа, которые вы хотите, поскольку в настоящее время нет способа указать переменное число в качестве аргументов универсального типа.

...