Проблема в том, что ваш таймер продолжает работать, даже если компонент уже удален из представления. В этом случае таймер просто попытается получить доступ к экземпляру компонента (потому что у него все еще есть ссылка на него) и вызовет GetMessage
, который в конечном итоге выполнит операцию с компонентом, которая не будет работать, потому что компонент действительно был disposed.
Что вы должны сделать, так это убедиться, что вы освободили все ресурсы при удалении компонента. Вы можете сделать это , реализовав IDisposable
с вашим компонентом. Обычно это будет выглядеть так:
@implements IDisposable
@code {
private Timer _timer;
protected override void OnInitialized()
{
_timer = new Timer(…);
}
public void Dispose()
{
_timer?.Dispose();
}
}
Поскольку ваш компонент наследуется от OwningComponentBase
, который уже реализует сам IDisposable
, вам нужно будет расширить удаление вашего компонента:
@inherits OwningComponentBase<TestBlazor.Client.APIGateway>
@code {
private Timer _timer;
protected override void OnInitialized()
{
_timer = new Timer(…);
}
protected override void Dispose(bool disposing)
{
_timer?.Dispose();
}
}