Я использую маркер отмены, который передается, так что мое обслуживание может быть отключено чисто. У службы есть логика, которая пытается подключиться к другим службам, поэтому токен - хороший способ вырваться из этих циклов повтора, запущенных в отдельных потоках. Моя проблема в том, что мне нужно сделать вызов службе, которая имеет внутреннюю логику повтора, но вернуться после заданного периода, если попытка повтора не выполнена. Я хотел бы создать новый токен отмены с тайм-аутом, который сделает это для меня. Проблема заключается в том, что мой новый токен не связан с маркером «master», поэтому, когда главный токен отменен, мой новый токен будет по-прежнему оставаться в живых до тех пор, пока не истечет время ожидания или не будет создано соединение, и оно будет возвращено. То, что я хотел бы сделать, - это связать два токена вместе, так что, когда главный будет отменен, новый будет отменен. Я попытался использовать метод CancellationTokenSource.CreateLinkedTokenSource
, но когда мой новый токен тайм-аута, он также отменил мастер-токен. Есть ли способ сделать то, что мне нужно делать с жетонами или это потребует внесения изменений в логику повторных попыток (вероятно, не будет в состоянии сделать это легко)Ссылка на токены отмены
Вот что я хочу сделать:
Мастер-токен - передал различные функции, чтобы служба могла отключиться. Временный токен - передается на одну функцию и устанавливается на таймаут через одну минуту
Если главный токен отменен, временный токен также необходимо отменить.
Срок действия временного токена не должен отменять мастер-токен.
Вы совершенно верны. Я начал использовать CancellationTokenSource.CreateLinkedTokenSource, но думал, что он не работает. Я забыл, что, когда токен разыгрывает, он выдает исключение. Это было уловлено в моем коде. Это создавало впечатление, что оно не работает так, как я ожидал. Положив мой вызов в блок catch try, он работал нормально. – Retrocoder
@Retrocoder Если вы хотите только ловушку внутреннего токена, я бы рекомендовал использовать шаблон, например 'try {doSomething (ct: childCts.Token); } catch (OperationCancelledException), когда (childCts.IsCancellationRequested) {} '. Вы можете поместить это внутри цикла повтора и создать источник дочернего токена внутри цикла. Затем, когда родительский токен отменяет, он будет пузыриться полностью, но когда дочерний токен отменяет, он просто выполняет повторную попытку. Я не могу сказать из вашего комментария - возможно, вы уже делаете это правильно ;-). – binki