В Mailkit, как плохо это не вызывать ImapClient.Disconnect - PullRequest
0 голосов
/ 26 февраля 2020

Я использую Mailkit в приложении Web.Api для получения почты с помощью ImapClient. Я использовал для подключения и отключения ImapClient при каждом вызове API. Однако он оказывается очень медленным, поэтому я решил не отключать клиент и сохранять ссылку на него с помощью MemoryCache, а использовать его при каждом вызове API.

Я думаю о том, чтобы вызвать отключение в тот момент пользователь закрывает или покидает веб-страницу, однако, я думаю, может случиться так, что это событие никогда не сработает, и API никогда не вызовет Disconnect.

Насколько это может быть плохо, если мое приложение никогда не вызывает ImapClient.Disconnect? Или какой другой подход я должен использовать вместо MemoryCache. Спасибо.

1 Ответ

0 голосов
/ 28 февраля 2020

После некоторых исследований, проб и ошибок я нашел механизм, который, я не знаю, является ли лучшим решением, но я делюсь им, если у кого-то есть подобная ситуация.

Когда я регистрирую свой объект в кеше памяти, я создаю политику следующим образом:

{
    ...
    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 час), вызывается обратный вызов и клиент отключается.

...