如何正确地在空闲循环中使用CountChanged

时间:2017-06-13 15:43:28

标签: mimekit

我应该如何在Idle循环中使用CountChanged事件中的Fetch?我看到了演示,其中有一个注释要取消空闲循环。

但如果我这样做 -

async void CountChanged(...)
{
    await Task.Run(() => idleToken.Cancel())
    Fetch(...)
}

Fetch将在任何MessageExpunge事件之后执行异步。这可能会破坏本地索引,可能期望CountChange已经更新了本地缓存索引。

  • 4 EXPUNGE
  • 3 EXISTS - 这里的CountChange事件可以在* 3 EXPUNGE之后执行,这会搞乱索引
  • 3 EXPUNGE

请指教?

2 个答案:

答案 0 :(得分:1)

这不仅是空闲问题。这适用于每个可以发出EXISTS主动响应的命令。我所做的不是从事件处理程序内部执行代码,而是使用CommandQueue,我在其中添加Actions,这是应该在事件处理程序中执行的代码。 Mailkit / Imap命令完成后,我按照我在同一个线程中同步接收它们的顺序执行CommandQueue操作。整体而言,Mailkit库非常好,祝贺伟大的工作。

答案 1 :(得分:0)

最简单的方法是使用2个ImapClient实例。一个只做IDLE,一个用于在消息计数改变时进行提取。

您的其他选择:

void CountChanged (object sender, EventArgs e)
{
    countChanged = true;
    idleToken.Cancel ();
}

然后:

await client.IdleAsync (idleToken, cancelToken);
if (countChanged) {
    client.Fetch (...);
}