我正在使用mongodb实现pubsub。如果使用nocursortimeout创建查询并指定tailablecursor:

using(var enumerator = _Collection.FindAs<BsonDocument>(Query.GTE("CreationTimeUTC", DateTime.UtcNow))
    .SetFlags(QueryFlags.AwaitData | QueryFlags.NoCursorTimeout | QueryFlags.TailableCursor)
    .SetSortOrder(SortBy.Ascending("$natural")).GetEnumerator))
{
    while(true)
    {
        if(enumerator.MoveNext())
        {
             //process the message here
        }
    }
}

moveNext()无限期阻塞(或直到数据可用或发生错误)。如果我想强制moveNext()返回(例如,如果我想取消侦听),该怎么做?对枚举器或游标调用dispose()?

最佳答案

如果不在光标上设置超时,那么只要MoveNext方法不接受CancellationToken,就可以做到这一点。
只需释放枚举器,捕获ObjectDisposedException并继续。
我有一个类似案例here.的解决方案示例,在本例中为:

try
{
    using(enumerator.CreateTimeoutScope(TimeSpan.FromHours(1)))
    {
        while(true)
        {
            if(enumerator.MoveNext())
            {
                 //process the message here
            }
        }
    }
}
catch (ObjectDisposedException)
{
}

09-25 17:15