我应该如何在Idle循环中使用CountChanged事件中的Fetch?我看到了演示,其中有一个注释要取消空闲循环。
但如果我这样做 -
async void CountChanged(...)
{
await Task.Run(() => idleToken.Cancel())
Fetch(...)
}
Fetch将在任何MessageExpunge事件之后执行异步。这可能会破坏本地索引,可能期望CountChange已经更新了本地缓存索引。
请指教?
答案 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 (...);
}