Как может код внутри Задачи знать, что истекло время ожидания? - PullRequest
1 голос
/ 29 ноября 2011

Рассмотрим следующий код:

public class EventManager
{
  public Task<string> GetResponseAsync(string request)
  {
    CancellationTokenSource tokenSource = new CancellationTokenSource();

    return new Task<string>( () =>
    {
      // send the request
      this.Send(request);

      // wait for the response until I've been cancelled or I timed out.
      // this is important because I want to cancel my "wait" if either occur

      // WHAT CODE CAN I WRITE HERE TO SEE IF THIS TASK HAS TIMED OUT?
      // (see the example below)
      // 
      // Note that I'm not talking about cancellation
      // (tokenSource.Token.IsCancellationRequested)

      return response;
    }, tokenSource.Token);
  }
}


public static void Main()
{
  EventManager mgr = new EventManager();
  Task<string> responseTask = mgr.GetResponseAsync("ping");
  responseTask.Start();

  if (responseTask.Wait(2000))
  {
    Console.WriteLine("Got response: " + responseTask.Result);
  }
  else
  {
    Console.WriteLine("Didn't get a response in time");
  }
}

Ответы [ 3 ]

2 голосов
/ 30 ноября 2011

Задача не включает функциональность тайм-аута из коробки.По сути, вы можете добавить это, запустив Таймер, который отменит задание после истечения времени ожидания, если оно еще не выполнено.

Джо Хоад предоставляет реализацию в блоге Parallel FX Team делает это и покрывает несколько крайних случаев, которые можно легко пропустить.

1 голос
/ 29 ноября 2011

В этом случае вы не будете.

Если вы хотите иметь возможность завершить задачу, которая не возвращается вовремя, вам нужно передать свой токен отмены асинхронному вызову (вместо создания его внутри этого метода), чтобы вы могли сигнализироватьдля отмены от вашего абонента (в данном случае Main).

0 голосов
/ 29 ноября 2011

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

Если вы хотите сообщить Task, что вас больше не интересуют его результаты, лучшим способом является использование отмены.

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