У меня есть приложение формы Windows
, которое я хочу, чтобы на каждом OnLoad
запускалась асинхронная Task
, которая устанавливается на следующем OnLoad
.
После запуска с Profiler
я вижу, что число объектов становится больше и больше после каждого OnLoad
.
Я знаю, что GC
не освобождает память при вызове Dispose
и при установке на null
. Должен ли я переопределить финализатор?
Я также рассмотрел CancellationTokenSource
, но я
Форма
public class MyForm:Form
{
private Task task;
protected override OnLoad()
{
if(this.task!=null)
{
this.task.Dispose();
this.task=null;
}
this.task=Task.Run(()=>....);
}
}
с токеном
public class MyForm:Form
{
private Task task;
private CancellationTokenSource=new CancellationTokenSource();
protected override OnLoad()
{
if(this.task!=null)
{
src.Cancel();
}
try
{
this.task=Task.Run(()=>....,src.Token);
}catch(TaskCancelledException ex)
{
return;
}
}
}
Проблема с CancellationTokenSource
заключается в том, что, как вы можете видеть, я бы позвонил Cancel
на предыдущем Task
(при втором OnLoad
вызове я бы выбрал первый Task
), и я не знаю, если это будет обработано в блоке Try-Catch
.
Какой хороший способ избавиться от объекта Task
как можно скорее? Это Form
будет непрерывно перезагружаться на компьютере через определенные промежутки времени, и я не хочу его утилизировать, просто Task