В C # функция может иметь несколько «разновидностей» - в зависимости от типа и количества отправленных параметров она будет вызывать «с таким ароматом».Поскольку мы смотрим на документацию для PostAsync
, мы можем видеть следующие "ароматы".(https://docs.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.postasync?view=netframework-4.7.2)
PostAsync(Uri, HttpContent, CancellationToken)
Отправка запроса POST с токеном отмены как асинхронная операция.
PostAsync(String, HttpContent, CancellationToken)
Отправка запроса POST смаркер отмены как асинхронная операция.
PostAsync(String, HttpContent)
Отправка запроса POST на указанный Uri в качестве асинхронной операции.
PostAsync(Uri, HttpContent)
Отправьте POST-запрос на указанный Uri в качестве асинхронной операции.
Если мы внимательно рассмотрим их, то увидим, что первые 2 имеют 3 параметра, а третий параметр в обоих именуется «CancellationToken». (Вы можете прочитать остальную часть документации, чтобы узнать, что они делают.)
Следующие два имеют 2 параметра без токена.
В своем вызове вы переходите к переменным, как показано ниже
var response = await client.PostAsync(ServerTokenString, token);
Поскольку вы передаете два параметра, вы вызовете 3-ю или 4-ю версию в приведенном выше списке. Это означает, что они не являются токенами (даже с «токеном» в именах).
Вы можете изменить свой кодкак это: (адаптировано из https://docs.microsoft.com/en-us/dotnet/api/system.threading.cancellationtoken?view=netframework-4.7.2)
// Define the cancellation token.
CancellationTokenSource source = new CancellationTokenSource();
CancellationToken CToken = source.Token;
var response = await client.PostAsync(ServerTokenString, token, CToken);
Однако, это не принесет пользы.Поскольку вы используете await
, PostAsync завершится до того, как наступит время для использования CancellationToken.
CancellationToken используется только в том случае, если процесс выполняется в другом потоке - использование метода await ожидает завершения потока, поэтому вам НИКОГДА это не понадобится.