Отмена всех задач. Выполнение определенного метода - PullRequest
0 голосов
/ 02 июля 2019

Если я постоянно запускаю несколько Task.Run(method), которые могут блокировать, есть ли способ обнаружить (или кэшировать для последующей отмены) заблокированные задачи, ожидая, например, lock{} или Waitone() внутри method?

Так, например, если я скажу:

Task.Run(() =>               
{
    TradingSystem.QuoteUpdate(quote); //QuoteUpdate may block for several reasons
});

Как мне позже cancel только те tasks, которые выполняют именно method TradingSystem.QuoteUpdate и имеютне работает до завершения?

1 Ответ

4 голосов
/ 02 июля 2019

Нет способа перечислить «все задачи», тем более «все задачи, выполняемые определенным методом». Таким образом, вам нужно хранить их во время создания, если вам потребуется выполнить их повторение позже.

Отмена фактически не требует, чтобы вы знали задачу, поскольку вы можете передать один и тот же токен отмены всем задачам такого рода - см. Как отменить задачу в ожидании? .

Но ... это не поможет вам, так как отмена задач - это совместная деятельность, а задачи, заблокированные на lock, или любые другие ожидания не смогут отменить себя. См. Как отменить заблокированную задачу в C # с помощью токена отмены? и аналогичные сообщения о взломах, которые люди пытаются обойти этим ограничением. По сути, вы ничего не можете сделать безопасно, кроме как сделать свой код действительно асинхронным и отменяемым во всех вызовах.

...