У меня есть class WorkerTaskEvent : IDisposable
, который имеет свойство типа Task
. При создании он создаст новую задачу, которая будет запускать какой-то метод в фоновом режиме, который должен заканчиваться в какой-то момент.
Однако иногда задача не заканчивается, тем самым сохраняя вещи в памяти навсегда. Сейчас я использую маркер отмены, чтобы отправить сообщение об отмене и я делаю это так:Устранение объекта с запущенной задачей?
public WorkerTaskEvent(ExecuteTaskMethod taskMethod)
{
TaskMethod = taskMethod;
RunningTask = Task.Factory.StartNew(OnExecuteTask, Token.Token);
}
private void OnExecuteTask()
{
if (TaskMethod != null) TaskMethod();
}
public void Dispose()
{
if (RunningTask != null && !RunningTask.IsCompleted)
{
Token.CancelAfter(TimeSpan.FromMinutes(1));
}
}
(. Там больше кода, включая код, чтобы проверить, если задача завершается в течение определенного периода времени)
I не может выполнить эту задачу навсегда, и я надеюсь, что это правильное решение, но, возможно, у кого-то есть лучший вариант?
У меня нет абсолютно никакого контроля над тем, что TaskMethod будет делать точно, поэтому, если любые ресурсы будут потеряны, когда этот метод будет убит, штраф. Тем не менее, он не идеален. Но очистка будет зависеть от тех, кто создает метод, стоящий за этим делегатом.
Передача маркера отмены на делегированный метод может помочь много, я не могу использовать это как решение, поскольку делегированный метод является частью сторонней библиотеки, и он не должен заканчиваться бесконечным циклом. Закон Мерфи снова смеется мне в лицо, потому что делегат, как правило, бесконечно зацикливается. Может быть, я могу передать токен отмены в следующей версии этой библиотеки (я просил об этом), но на данный момент мне приходится останавливать бесконечный цикл в трудной ситуации ...
No. Мне нужно знать, если я могу закончить нить в некотором роде, если она заканчивается в бесконечном цикле. Но я нашел альтернативное решение, поэтому Q может оставаться закрытым. –