2014-05-09 27 views
2

我正在使用MongoDB实现PubSub。如果我创造我的查询指定与NoCursorTimeout一个TailableCursor:如何取消可拖动光标上的MoveNext操作

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()?

回答

1

如果您没有在光标上设置超时,那么几乎所有可以做的事情,只要MoveNext方法不接受CancellationToken。 只需处理统计员,赶上ObjectDisposedException然后继续。

我有一个类似的案件here.的解决方案例如在这种情况下将是:

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