Подождите 100 миллисекунд, пока данные не будут возвращены методом, иначе выведите исключение - PullRequest
3 голосов
/ 24 августа 2010

Как я могу получить какие-либо данные, возвращаемые методом или свойством в течение определенного периода времени, и если в этот период времени возвращаются какие-либо данные, возникает исключение?

Практически у меня есть простой метод, который будет выполнять простую задачу, однажды выполнив метод, возвращает значение, и если какое-либо значение будет возвращено в течение 100 миллисекунд, я хочу, чтобы метод был прерван и было сгенерировано исключение, например TimeoutException например, любое исключение, если оно выполняет задачу.

Ответы [ 5 ]

8 голосов
/ 24 августа 2010

Если у вас есть доступ к .NET 4, я предлагаю вам взглянуть на новый класс Task.Создайте задание с работой, которую вы хотите сделать, и начните это.Метод Wait позволяет указать значение времени ожидания.Wait возвращает бул, так что вы знаете, если тайм-аут произошел или нет.

5 голосов
/ 24 августа 2010

Если вы используете .NET 3.5 и не можете использовать параллельные расширения, вы можете использовать асинхронные делегаты. Это дает дополнительное преимущество повторного выброса исключений, создаваемых методом в вызывающем потоке. Логика тайм-аута в этом примере основана на WaitHandle, как упомянуто leppie.

public static T EvaluateAsync<T> (this Func<T> func, Timespan timeout)
{
  var result = func.BeginInvoke(null, null);

  if (!result.AsyncWaitHandle.WaitOne(timeout))
       throw new TimeoutException ("Operation did not complete on time.");

  return func.EndInvoke(result);
}

static void Example()
{
   var myMethod = new Func<int>(ExampleLongRunningMethod);

  // should return
  int result = myMethod.EvaluateAsync(TimeSpan.FromSeconds(2));

  // should throw
  int result2 = myMethod.EvaluateAsync(TimeSpan.FromMilliseconds(100));
}

static int ExampleLongRunningMethod()
{
  Thread.Sleep(1000);
  return 42;
}
2 голосов
/ 24 августа 2010
2 голосов
/ 24 августа 2010

Посмотрите на WaitHandle и его производные. Должен делать то, что вы хотите.

0 голосов
/ 24 августа 2010

Хорошо - вы можете запустить метод в другом потоке, и если поток не вернется в течение установленного периода времени, прервите его.Хотя, если вы смотрите на очень маленькие таймфреймы, то в этом случае будут большие накладные расходы.(Кстати, вы можете использовать перегрузку Thread.Join для ожидания оговоренного времени).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...