0

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

但是,如果我这样做 -

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

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

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

请指教?

4

2 回答 2

1

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

于 2017-06-14T17:36:36.630 回答
0

最简单的做法是使用 2 个 ImapClient 实例。一种只执行 IDLE,另一种在消息计数更改时执行获取。

您的另一个选择:

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

然后:

await client.IdleAsync (idleToken, cancelToken);
if (countChanged) {
    client.Fetch (...);
}
于 2017-06-14T12:23:53.110 回答