Параметр по умолчанию — CancellationToken

Я использую следующий код:

public async Task SendMessage(string msg, CancellationToken ct = default(CancellationToken))

Но я думаю, что это неправильно, потому что, если вызывающая сторона вызывает SendMessage без предоставления маркера отмены, код будет работать со значением по умолчанию, таким же, как CancellationToken.None, поэтому он будет ждать без истечения времени.

Так что, может быть, это лучше:

public async Task SendMessage(string msg, CancellationToken ct)

Что вы думаете?


person maz    schedule 25.02.2017    source источник
comment
Рекомендуется сделать ваши CancellationToken параметры необязательными только в общедоступном API (если он у вас есть) и оставить их в качестве обязательных параметров везде. -- ответ и ссылка на статья, представленная в ответе ниже.   -  person Svek    schedule 25.02.2017


Ответы (2)


Это действительно зависит от вашей реализации метода... Посмотрите ниже:

Необязательный параметр CancellationToken

Если вы хотите принять CancellationToken, но хотите сделать его необязательным, вы можете сделать это с помощью такого синтаксиса:

public Task SomethingExpensiveAsync(CancellationToken cancellationToken = default(CancellationToken))
{
   // don’t worry about NullReferenceException if the
   // caller omitted the argument because it’s a struct.
   cancellationToken.ThrowIfCancellationRequested();
}

Хорошая идея сделать параметры CancellationToken необязательными только в общедоступном API (если он у вас есть) и оставить их в качестве обязательных параметров везде. Это действительно помогает гарантировать, что вы намеренно распространяете свои CancellationToken через все методы, которые вы вызываете (№ 2 выше). Но, конечно, не забудьте переключиться на прохождение CancellationToken.None, как только вы пройдете точку неотмены.

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

Взято из MSDN: Рекомендуемые шаблоны. для CancellationToken

person Svek    schedule 25.02.2017

Да, если вы хотите, чтобы вызывающий объект всегда передавал CancelationToken, вы должны принудительно указать его с явным параметром:

public async Task SendMessage(string msg, CancellationToken ct)

Конечно, вызывающий может передать CancellationToken.None, но это не ваш выбор. Вы создаете «контракт», который требует CancellationToken.

person Backs    schedule 25.02.2017