Здравствуйте, Passerby, Вы писали:
P>А вообще схема правильная решения задачи или можно решить без вызова исключений?
Специально провоцировать их не стоит. Но и специально их избегать, без необходимости — так же смысла не имеет.
По сути всё сводится к метрике: сколько исключений генерируется в секунду и она в среднем должна быть адекватной (около ноля).
А насчет схемы в целом — то, ну, в целом как бы похоже, но не совсем. У меня такое чувство, что ты пытаешься сделать обычное чтение с таймаутом, и отсюда вопрос — это что/чем ты читаешь, что готового таймаута нет?
Ну, а если ты хочешь сделать ReadAsync с таймаутом руками, то цикл в Main не должен вообще манипулировать CTS (по крайней мере не в таком смысле).
CTS создается, в ReadAsync, запускается таймер (например через Task.Delay, но проще/лучше использовать CancelAfter), делается ее продолжение отменяющий CTS (в случае если используется Task.Delay). И запускается задача/настоящее чтение которая может быть отменена по таймауту (посредством только что созданного CTS). Еще не забываем, что в ReadAsync мы можем захотеть передать свой токен, и теперь нам нужно уже ждать на двух токенах — т.е. в самом начале создаем Linked CTS, а не обычный. В общем, оно не сложно делается, стандартный подход для библиотечного кода. Но я не понял точно ли это тебе нужно.