После некоторых исследований, проб и ошибок я нашел механизм, который, я не знаю, является ли лучшим решением, но я делюсь им, если у кого-то есть подобная ситуация.
Когда я регистрирую свой объект в кеше памяти, я создаю политику следующим образом:
{
...
cacheService.Set(key, client, CreateItemCachePolicy());
...
}
private CacheItemPolicy CreateItemCachePolicy()
{
CacheItemPolicy p = new CacheItemPolicy();
p.AbsoluteExpiration = DateTimeOffset.Now.Add(TimeSpan.FromHours(1));
p.RemovedCallback = this.RemovedCallback;
return p;
}
private void RemovedCallback(CacheEntryRemovedArguments args)
{
ImapClient client = args.CacheItem.Value as ImapClient;
if (client != null)
{
client.Disconnect(true);
}
}
Кэш памяти, очевидно, работает в отдельном потоке и периодически выполняет очистку кеша. Когда время кэша клиента истекает (1 час), вызывается обратный вызов и клиент отключается.