Подтвердить что ты не робот

Что стоит использовать Task.Delay()?

Я думаю об использовании С# async\wait в игровом сервере MMO с логикой, управляемой событиями. Предположим, что тысячи лиц выполняют некоторую работу с известными длительностями. Поэтому я хотел бы вызвать Time.Delay() для каждого из моих игровых объектов. (Это противоположный подход к общему бесконечному циклу с некоторым вызовом Update() для каждого игрового объекта.)

Кто-нибудь знает, как реализовать Task.Delay()? Использует ли он таймеры? Это тяжело для системных ресурсов?

Можно ли вызывать тысячи одновременных вызовов Task.Delay()?

4b9b3361

Ответ 1

Task.Delay реализуется следующим образом:

public static Task Delay(int millisecondsDelay, CancellationToken cancellationToken)
{
  //error checking
  Task.DelayPromise delayPromise = new Task.DelayPromise(cancellationToken);
  if (cancellationToken.CanBeCanceled)
    delayPromise.Registration = cancellationToken.InternalRegisterWithoutEC((Action<object>) (state => ((Task.DelayPromise) state).Complete()), (object) delayPromise);
  if (millisecondsDelay != -1)
  {
    delayPromise.Timer = new Timer((TimerCallback) (state => ((Task.DelayPromise) state).Complete()), (object) delayPromise, millisecondsDelay, -1);
    delayPromise.Timer.KeepRootedWhileScheduled();
  }
  return (Task) delayPromise;
}

Он определенно использует таймеры. Они используются в классе под названием DelayPromise. Здесь реализация для этого:

private sealed class DelayPromise : Task<VoidTaskResult>
{
  internal readonly CancellationToken Token;
  internal CancellationTokenRegistration Registration;
  internal Timer Timer;

  internal DelayPromise(CancellationToken token)
  {
    this.Token = token;
  }

  internal void Complete()
  {
    if (!(this.Token.IsCancellationRequested ? this.TrySetCanceled(this.Token) : this.TrySetResult(new VoidTaskResult())))
      return;
    if (this.Timer != null)
      this.Timer.Dispose();
    this.Registration.Dispose();
  }
}

Он использует таймер, но для меня это не похоже. Таймер просто обращается к полному методу, и то, что это делает, - это проверка, если он отменен, если так отменить его, иначе просто верните результат. Мне это кажется прекрасным.